2017-03-31 71 views
0

我必須用Matlab分析一些STL文件,並且我用STL閱讀器成功導入它們,但此函數僅返回頂點和麪(三角形)。從三角測量的邊緣/頂點矩陣

這是the STL reader我正在使用和this is an example STL file,由gmsh工具生成gmsh -2 -format stl -bin t4.geo。在這種情況下,STL功能的代碼在最後。

mesh = stlread("t4.stl"); 

是否有一個函數可以用來從這樣的三角測量中獲得頂點/邊緣鄰接矩陣?

function [F,V,N] = stlbinary(M) 

    F = []; 
    V = []; 
    N = []; 

    if length(M) < 84 
     error('MATLAB:stlread:incorrectFormat', ... 
       'Incomplete header information in binary STL file.'); 
    end 

    % Bytes 81-84 are an unsigned 32-bit integer specifying the number of faces 
    % that follow. 
    numFaces = typecast(M(81:84),'uint32'); 
    %numFaces = double(numFaces); 
    if numFaces == 0 
     warning('MATLAB:stlread:nodata','No data in STL file.'); 
     return 
    end 

    T = M(85:end); 
    F = NaN(numFaces,3); 
    V = NaN(3*numFaces,3); 
    N = NaN(numFaces,3); 

    numRead = 0; 
    while numRead < numFaces 
     % Each facet is 50 bytes 
     % - Three single precision values specifying the face normal vector 
     % - Three single precision values specifying the first vertex (XYZ) 
     % - Three single precision values specifying the second vertex (XYZ) 
     % - Three single precision values specifying the third vertex (XYZ) 
     % - Two unused bytes 
     i1 = 50 * numRead + 1; 
     i2 = i1 + 50 - 1; 
     facet = T(i1:i2)'; 

     n = typecast(facet(1:12),'single'); 
     v1 = typecast(facet(13:24),'single'); 
     v2 = typecast(facet(25:36),'single'); 
     v3 = typecast(facet(37:48),'single'); 

     n = double(n); 
     v = double([v1; v2; v3]); 

     % Figure out where to fit these new vertices, and the face, in the 
     % larger F and V collections.   
     fInd = numRead + 1;   
     vInd1 = 3 * (fInd - 1) + 1; 
     vInd2 = vInd1 + 3 - 1; 

     V(vInd1:vInd2,:) = v; 
     F(fInd,:)  = vInd1:vInd2; 
     N(fInd,:)  = n; 

     numRead = numRead + 1; 
    end 

end 
+0

如果你的臉,你的人幾乎都有邊......這是本質上的一行代碼,我相信你能做到這一點,如果你嘗試。 – Ratbert

+0

應該很容易,但我看起來矩陣每三角形索引一次,所以我很困惑。事實是,臉部矩陣只是數字'1:nvertices'重新成形的列表。 – senseiwa

+0

我不明白這個代碼是如何與問題相關的。 – Ratbert

回答

2

假設你的面是在正3陣列F

% temporary array 
T = [F(:,1) F(:,2) ; F(:,1) F(:,3) ; F(:,2) F(:,3)]; 

% get the edges 
E = unique([min(T,[],2), max(T,[],2)],'rows'); 

% build the adjacency matrix 
n = max(E(:,2)); 
A = sparse(E(:,1), E (:,2), ones(size(E,1),1), n, n); 
A = A + A'; 

NB:稀疏數組是經常用於這種鄰接矩陣是有用的,特別是在大的限制。

最佳,

+0

謝謝!雖然我有一個奇怪的錯誤,看起來'A'不是方形的:當添加它的對稱性時,'A = A + A';',我有這個錯誤'使用+矩陣尺寸的錯誤必須同意。事實上,這個矩陣的維數比另一維更大:'>> size(A)ans = 4616 4617',這怎麼可能? – senseiwa

+0

是的,這可能發生取決於您的數據。我編輯了我的答案,以考慮到這一點。您只需要將您的鄰接矩陣的大小精確到「稀疏」函數。 – Ratbert

+0

謝謝!我有一個問題。我嘗試了一個非常簡單的網格,一個2×2的正方形網格,然後這個網格有9個頂點和8個面,有12個邊。然而,輸出矩陣是「相鄰矩陣:[24×24 double]」,而它應該是12x9(或最多9x12)。我錯過了什麼嗎? – senseiwa