Mesh: add overloaded mesh decimation to set target number of triangles

This commit is contained in:
wmayer
2020-05-03 15:04:50 +02:00
parent 23bf4e745d
commit a759c7ecd6
4 changed files with 57 additions and 0 deletions

View File

@@ -95,3 +95,52 @@ void MeshSimplify::simplify(float tolerance, float reduction)
myKernel.Adopt(new_points, new_facets, true);
}
void MeshSimplify::simplify(int targetSize)
{
Simplify alg;
const MeshPointArray& points = myKernel.GetPoints();
for (std::size_t i = 0; i < points.size(); i++) {
Simplify::Vertex v;
v.p = points[i];
alg.vertices.push_back(v);
}
const MeshFacetArray& facets = myKernel.GetFacets();
for (std::size_t i = 0; i < facets.size(); i++) {
Simplify::Triangle t;
for (int j = 0; j < 3; j++)
t.v[j] = facets[i]._aulPoints[j];
alg.triangles.push_back(t);
}
// Simplification starts
alg.simplify_mesh(targetSize, FLT_MAX);
// Simplification done
MeshPointArray new_points;
new_points.reserve(alg.vertices.size());
for (std::size_t i = 0; i < alg.vertices.size(); i++) {
new_points.push_back(alg.vertices[i].p);
}
std::size_t numFacets = 0;
for (std::size_t i = 0; i < alg.triangles.size(); i++) {
if (!alg.triangles[i].deleted)
numFacets++;
}
MeshFacetArray new_facets;
new_facets.reserve(numFacets);
for (std::size_t i = 0; i < alg.triangles.size(); i++) {
if (!alg.triangles[i].deleted) {
MeshFacet face;
face._aulPoints[0] = alg.triangles[i].v[0];
face._aulPoints[1] = alg.triangles[i].v[1];
face._aulPoints[2] = alg.triangles[i].v[2];
new_facets.push_back(face);
}
}
myKernel.Adopt(new_points, new_facets, true);
}