Find Concave Edges in STL-File
17 次查看(过去 30 天)
显示 更早的评论
Hello all,
I am looking for a method to identify concave edges of an STL model which is not too computationally intensive..
The stlread function provides the vertex-coordinates (mx3), faces (nx3) and normals of the faces (nx3)... Where m is the number of all triangle vertices and n is the number of corresponding face-indices.
The edges I want to identify are the ones I marked red (as an example):
I tried different methods which all took ages too compute.
For example I created an Triangulation object using the triangulate function and compared the angle between normals of adjacent faces to further on store their common edge in case of exceeding a treshold - stopped working on this idea because of the sheer amount of calculations needed.
Pseudo Code:
TR = triangulation(faces,x,y,z);
% Compare all faces if they are neighbors
for queryId=1:(size(TR.ConnectivityList,1))
for compId = 1:(size(TR.ConnectivityList,1))
% ID for comparison is not equal to query ID
if queryId ~= compId
% If faces are connected calculate angle between face
% normals
if (TR.isConnected(queryId,compId))
n1 = TR.faceNormal(queryId);
n2 = TR.faceNormal(compId);
theta = acos(dot(n1,n2) / (norm(n1)*norm(n2)));
% Do further calculations here if theta > treshold
end
end
end
end
I also tried using the Triangulation objects property "featureEdges" to extract these edges, but unfortunately it doesn't yield the result I expected (right picture), although it works quite fine for the example (left picture) provided in the function file.
Hope anybody can help me. Thanks!
2 个评论
回答(1 个)
ET
2023-7-16
编辑:ET
2023-7-16
featureEdges isn't working because the stl files have unique vertices defined for every triangle. This means that every triangle is all alone with no neighbours - so no features to find.
To fix this, you need to remap faces so that neighbouring triangles share vertices.
F = faces;
V = [x,y,z];
% find shared vertices and remap faces
[V2,~,IC] = uniquetol(V,'ByRows',true);
F2 = IC(F);
TR = triangulation(F2,V2);
trisurf(TR,'linestyle','none');
axis equal
grid on
hold all
% Find and plot feature edges
F = featureEdges(TR,pi/4);
x = HR.Points(:,1);
y = HR.Points(:,2);
z = HR.Points(:,3);
plot3(x(F)',y(F)',z(F)','-r','LineWidth',1.5)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Delaunay Triangulation 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!