20 std::size_t v1, std::size_t v2,
math::Vec3f const& new_vert,
21 std::vector<std::size_t>
const& afaces,
22 float acos_threshold = 0.95f)
29 for (std::size_t i = 0; i < vinfo1.
verts.size(); ++i)
31 std::size_t ip1 = (i + 1) % vinfo1.
verts.size();
32 if (vinfo1.
verts[i] == v2 || vinfo1.
verts[ip1] == v2)
40 float dot = n1.
dot(n2);
46 for (std::size_t i = 0; i < vinfo2.
verts.size(); ++i)
48 std::size_t ip1 = (i + 1) % vinfo2.
verts.size();
49 if (vinfo2.
verts[i] == v1 || vinfo2.
verts[ip1] == v1)
56 float dot = n1.
dot(n2);
65 for (std::size_t i = 0; i < vinfo2.
faces.size(); ++i)
66 for (std::size_t j = 0; j < 3; ++j)
67 if (faces[vinfo2.
faces[i] * 3 + j] == v2)
68 faces[vinfo2.
faces[i] * 3 + j] = v1;
71 std::size_t v3 = 0, v4 = 0;
72 for (std::size_t i = 0; i < 3; ++i)
74 std::size_t fid1 = afaces[0] * 3 + i;
75 std::size_t fid2 = afaces[1] * 3 + i;
76 if (faces[fid1] != v1 && faces[fid1] != v2)
78 if (faces[fid2] != v1 && faces[fid2] != v2)
85 for (std::size_t i = 0; i < vinfo2.
verts.size(); ++i)
87 std::size_t
const vert_id = vinfo2.
verts[i];
88 if (vert_id != v1 && vert_id != v3 && vert_id != v4)
89 mesh_info[vert_id].replace_adjacent_vertex(v2, v1);
103 for (std::size_t i = 0; i < vinfo2.
faces.size(); ++i)
104 if (vinfo2.
faces[i] != afaces[0] && vinfo2.
faces[i] != afaces[1])
109 vinfo2.
faces.clear();
110 vinfo2.
verts.clear();
125 unsigned int const* vid,
126 std::size_t* shortest_edge_v1, std::size_t* shortest_edge_v2)
128 typedef std::pair<float, int> Edge;
130 for (
int j = 0; j < 3; ++j)
132 int const jp1 = (j + 1) % 3;
133 edges[j].first = (verts[vid[j]] - verts[vid[jp1]]).square_norm();
139 float const square_ratio = edges[0].first / edges[1].first;
140 if (shortest_edge_v1 !=
nullptr && shortest_edge_v2 !=
nullptr)
142 *shortest_edge_v1 = vid[edges[0].second];
143 *shortest_edge_v2 = vid[(edges[0].second + 1) % 3];
153 float const square_needle_ratio_thres =
MATH_POW2(needle_ratio_thres);
164 std::size_t num_collapses = 0;
166 for (std::size_t i = 0; i < faces.size(); i += 3)
169 if (faces[i] == faces[i + 1] && faces[i] == faces[i + 2])
174 float const needle_ratio_squared
175 = get_needle_ratio_squared(verts, &faces[i], &v1, &v2);
176 if (needle_ratio_squared > square_needle_ratio_thres)
185 std::vector<std::size_t> afaces;
187 if (afaces.size() != 2)
191 math::Vec3f new_v = (verts[v1] + verts[v2]) / 2.0f;
199 return num_collapses;
209 std::size_t num_collapses = 0;
210 for (std::size_t v1 = 0; v1 < verts.size(); ++v1)
215 if (vinfo.
verts.size() != 3)
218 std::pair<float, std::size_t> edge_len[3];
219 for (std::size_t j = 0; j < vinfo.
verts.size(); ++j)
220 edge_len[j] = std::make_pair(
221 (verts[vinfo.
verts[j]] - verts[v1]).square_norm(),
224 std::size_t v2 = edge_len[0].second;
226 std::vector<std::size_t> afaces;
228 if (afaces.size() != 2)
232 if (
edge_collapse(mesh, mesh_info, v1, v2, verts[v2], afaces))
239 return num_collapses;
247 std::size_t num_collapsed = 0;
251 return num_collapsed;
Vector class for arbitrary dimensions and types.
T dot(Vector< T, N > const &other) const
Dot (or scalar) product between self and another vector.
Vector< T, N > normalized(void) const
Returns a normalized copy of self.
std::vector< math::Vec3f > VertexList
void get_faces_for_edge(std::size_t v1, std::size_t v2, std::vector< std::size_t > *adjacent_faces) const
Returns faces adjacent to both vertices.
void update_vertex(TriangleMesh const &mesh, std::size_t vertex_id)
Updates the vertex info for a single vertex.
@ VERTEX_CLASS_UNREF
Vertiex without any adjacent triangles.
@ VERTEX_CLASS_SIMPLE
Vertex with a single closed fan of adjacent triangles.
std::shared_ptr< TriangleMesh > Ptr
std::vector< VertexID > FaceList
#define FSSR_NAMESPACE_END
#define FSSR_NAMESPACE_BEGIN
std::size_t clean_caps(mve::TriangleMesh::Ptr mesh)
Cleans caps from the mesh by removing vertices with only three adjacent triangles.
std::size_t clean_mc_mesh(mve::TriangleMesh::Ptr mesh, float needle_ratio_thres)
Removes degenerated triangles from the mesh typical for Marching Cubes.
bool edge_collapse(mve::TriangleMesh::Ptr mesh, mve::MeshInfo &mesh_info, std::size_t v1, std::size_t v2, math::Vec3f const &new_vert, std::vector< std::size_t > const &afaces, float acos_threshold=0.95f)
std::size_t clean_needles(mve::TriangleMesh::Ptr mesh, float needle_ratio_thres)
Cleans needles from the mesh by collapsing short edges of degenerated triangles.
void sort_values(T *a, T *b, T *c)
std::size_t mesh_delete_unreferenced(TriangleMesh::Ptr mesh)
Cleans unreferenced vertices from the mesh.
Per-vertex classification and adjacency information.
void remove_adjacent_face(std::size_t face_id)
void remove_adjacent_vertex(std::size_t vertex_id)