Find Concave Edges in STL-File

14 visualizaciones (últimos 30 días)
Timo Schmid
Timo Schmid el 19 de En. de 2021
Editada: ET el 16 de Jul. de 2023
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
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 comentarios
ET el 15 de Jul. de 2023
Me too, any solutions?

Iniciar sesión para comentar.

Respuestas (1)

ET el 16 de Jul. de 2023
Editada: ET el 16 de Jul. de 2023
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);
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);

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by