Find discontinuous areas in geometry

4 views (last 30 days)
Chenglin Li
Chenglin Li on 9 Jun 2023
Commented: Chenglin Li on 15 Jun 2023
There is an stl file of a concave surface, known the vertices and joint indexes of each face, as well as the normal vectors of each face, to obtain the discontinuous region, that is, the concave face and the vertex information contained in the face, as shown in the figure below.
My idea is to find the concave part by judging that the Angle between the normal vectors of the adjacent faces is less than or equal to 90 degrees, and output the concave faces, but my program outputs all the faces, I don't know why
[VF] = stlread("ASCao.stl");
% normal is for every outward facing normal vector
[normals] = lin_compute_mesh_normal(VF.Points,VF.ConnectivityList);
% %Plot the mesh with the normals:
lin_plot_face_normal(VF.Points,VF.ConnectivityList,normals);
faces = VF.ConnectivityList;
[verticesOnFace] = findVerticesOnFace(2, VF.Points, faces);
% Find the concave face
concaveFaces = [];
for i = 1 : size(VF.ConnectivityList, 1)
% Gets the face ids of the current and adjacent faces
faceId = i;
adjFaceIds = vertexAttachments(faces, faceId);
% Determine whether the current face is recessed
isConcave = false;
for j = 1 : size(adjFaceIds, 2)
if dot(normals(faceId,:), normals(adjFaceIds(j),:)) <= 0
% The Angle between the normal vectors of adjacent faces is less than or equal to 90 degrees
% (that is, both sides are less inclined, and there may be a concave part).
isConcave = true;
break;
end
end
% If the current face is concave, it is added to the result array
if isConcave
concaveFaces = [concaveFaces; faceId];
end
end
% Output the ID of the concave face
disp(concaveFaces);
function [attachments] = vertexAttachments(faces, faceId)
% Computes the face ids of all faces adjacent to the specified face
numFaces = size(faces, 1);
adjFaceIds = [];
faceVertices = faces(faceId,:);
for i = 1 : numFaces
sameVertexCount = 0;
for j = 1 : 3
if ismember(faces(i,j), faceVertices)
sameVertexCount = sameVertexCount + 1;
end
if sameVertexCount == 2
adjFaceIds(end+1) = i;
break;
end
end
end
% Returns the face ID of all faces adjacent to the specified face
attachments = adjFaceIds(adjFaceIds ~= faceId);
end
function [verticesOnFace] = findVerticesOnFace(faceId, vertices, faces)
% Find all vertex coordinates on the specified face ID
faceVertices = faces(faceId,:);
verticesOnFace = [];
for i = 1 : size(vertices, 1)
if ismember(vertices(i,:), vertices(faceVertices,:), 'rows')
verticesOnFace(end+1,:) = vertices(i,:);
end
end
end
  5 Comments
Joel Hottinger
Joel Hottinger on 14 Jun 2023
Edited: Joel Hottinger on 14 Jun 2023
What other information do you have about each face? I can't think of any way in which you could determine concavity with only the normal vectors.
I edited my previous comment to show the issue. Imagine the normal vectors are centered on the origin, they would look identical in that case.
Chenglin Li
Chenglin Li on 15 Jun 2023
There's no other information about each face, normal is just a method that I tried, but it's not clear what to do after this method fails.

Sign in to comment.

Answers (0)

Community Treasure Hunt

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

Start Hunting!