mirror of https://github.com/CGAL/cgal
make it work with Polyhedron
This commit is contained in:
parent
2e070b304a
commit
8abe5b0c23
|
|
@ -399,7 +399,7 @@ acvd_impl(TriangleMesh& tmesh,
|
||||||
|
|
||||||
using Matrix4x4 = typename Eigen::Matrix<FT, 4, 4>;
|
using Matrix4x4 = typename Eigen::Matrix<FT, 4, 4>;
|
||||||
|
|
||||||
using Vertex_position_map = typename GetVertexPointMap<TriangleMesh, NamedParameters>::const_type;
|
using Vertex_position_map = typename GetVertexPointMap<TriangleMesh, NamedParameters>::type;
|
||||||
|
|
||||||
using halfedge_descriptor = typename boost::graph_traits<TriangleMesh>::halfedge_descriptor;
|
using halfedge_descriptor = typename boost::graph_traits<TriangleMesh>::halfedge_descriptor;
|
||||||
using edge_descriptor = typename boost::graph_traits<TriangleMesh>::edge_descriptor;
|
using edge_descriptor = typename boost::graph_traits<TriangleMesh>::edge_descriptor;
|
||||||
|
|
@ -635,17 +635,48 @@ acvd_impl(TriangleMesh& tmesh,
|
||||||
|
|
||||||
// randomly initialize clusters
|
// randomly initialize clusters
|
||||||
//TODO: (possible optimization) use std::lower_bound with vertex_weight_pmap for better sampling
|
//TODO: (possible optimization) use std::lower_bound with vertex_weight_pmap for better sampling
|
||||||
// moreover with non-random access iterators, the complexity will be bad
|
static constexpr bool is_rand_access =
|
||||||
|
std::is_same_v<typename std::iterator_traits<decltype(vertices(tmesh).begin())>::iterator_category,
|
||||||
|
std::random_access_iterator_tag>;
|
||||||
|
|
||||||
|
std::vector<vertex_descriptor> cluster_vertices;
|
||||||
|
cluster_vertices.reserve(nb_clusters);
|
||||||
|
if constexpr (is_rand_access)
|
||||||
|
{
|
||||||
|
for (int ci = 0; ci < nb_clusters; ++ci)
|
||||||
|
{
|
||||||
|
int vi;
|
||||||
|
vertex_descriptor vd;
|
||||||
|
do {
|
||||||
|
vi = rnd.get_int(0, nb_vertices);
|
||||||
|
vd = *std::next(vertices(tmesh).begin(), vi);
|
||||||
|
} while (get(vertex_cluster_pmap, vd) != -1);
|
||||||
|
|
||||||
|
cluster_vertices.push_back(vd);
|
||||||
|
put(vertex_cluster_pmap, vd, ci);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::vector<vertex_descriptor> verts;
|
||||||
|
verts.reserve(num_vertices(tmesh));
|
||||||
|
verts.assign(vertices(tmesh).begin(), vertices(tmesh).end());
|
||||||
|
|
||||||
|
for (int ci = 0; ci < nb_clusters; ++ci)
|
||||||
|
{
|
||||||
|
vertex_descriptor vd;
|
||||||
|
do {
|
||||||
|
vd = verts[rnd.get_int(0, nb_vertices)];
|
||||||
|
} while (get(vertex_cluster_pmap, vd) != -1);
|
||||||
|
|
||||||
|
cluster_vertices.push_back(vd);
|
||||||
|
put(vertex_cluster_pmap, vd, ci);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (int ci = 0; ci < nb_clusters; ++ci)
|
for (int ci = 0; ci < nb_clusters; ++ci)
|
||||||
{
|
{
|
||||||
int vi;
|
vertex_descriptor vd=cluster_vertices[ci];
|
||||||
vertex_descriptor vd;
|
|
||||||
do {
|
|
||||||
vi = rnd.get_int(0, nb_vertices);
|
|
||||||
vd = *(vertices(tmesh).begin() + vi);
|
|
||||||
} while (get(vertex_cluster_pmap, vd) != -1);
|
|
||||||
|
|
||||||
put(vertex_cluster_pmap, vd, ci);
|
|
||||||
Point_3 vp = get(vpm, vd);
|
Point_3 vp = get(vpm, vd);
|
||||||
Vector_3 vpv = vp - ORIGIN;
|
Vector_3 vpv = vp - ORIGIN;
|
||||||
clusters[ci].add_vertex(vpv, get(vertex_weight_pmap, vd), get(vertex_quadric_pmap, vd));
|
clusters[ci].add_vertex(vpv, get(vertex_weight_pmap, vd), get(vertex_quadric_pmap, vd));
|
||||||
|
|
@ -1273,7 +1304,7 @@ acvd_impl(TriangleMesh& tmesh,
|
||||||
*
|
*
|
||||||
* performs Approximated Centroidal Voronoi Diagram (ACVD) remeshing on a triangle mesh. The remeshing is either uniform or adaptative.
|
* performs Approximated Centroidal Voronoi Diagram (ACVD) remeshing on a triangle mesh. The remeshing is either uniform or adaptative.
|
||||||
* Note that there is no guarantee that the output mesh will have the same topology as the input.
|
* Note that there is no guarantee that the output mesh will have the same topology as the input.
|
||||||
* See \ref acvdrem for more details on the algorithm. This function required the \eigen library.
|
* See \ref acvdrem for more details on the algorithm. This function requires the \eigen library.
|
||||||
*
|
*
|
||||||
* @tparam TriangleMesh a model of `FaceListGraph` and `MutableFaceGraph`
|
* @tparam TriangleMesh a model of `FaceListGraph` and `MutableFaceGraph`
|
||||||
* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters".
|
* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters".
|
||||||
|
|
|
||||||
|
|
@ -622,7 +622,7 @@ void interpolated_corrected_curvatures_one_vertex(
|
||||||
using parameters::get_parameter;
|
using parameters::get_parameter;
|
||||||
using parameters::is_default_parameter;
|
using parameters::is_default_parameter;
|
||||||
|
|
||||||
Vertex_position_map vpm = choose_parameter(get_parameter(np, CGAL::vertex_point),
|
Vertex_position_map vpm = choose_parameter(get_parameter(np, internal_np::vertex_point),
|
||||||
get_const_property_map(CGAL::vertex_point, pmesh));
|
get_const_property_map(CGAL::vertex_point, pmesh));
|
||||||
|
|
||||||
Vertex_normal_map vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map),
|
Vertex_normal_map vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map),
|
||||||
|
|
@ -773,7 +773,7 @@ private:
|
||||||
using parameters::get_parameter;
|
using parameters::get_parameter;
|
||||||
using parameters::is_default_parameter;
|
using parameters::is_default_parameter;
|
||||||
|
|
||||||
vpm = choose_parameter(get_parameter(np, CGAL::vertex_point),
|
vpm = choose_parameter(get_parameter(np, internal_np::vertex_point),
|
||||||
get_const_property_map(CGAL::vertex_point, pmesh));
|
get_const_property_map(CGAL::vertex_point, pmesh));
|
||||||
|
|
||||||
vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map),
|
vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map),
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
#include <CGAL/Polygon_mesh_processing/approximated_centroidal_Voronoi_diagram_remeshing.h>
|
#include <CGAL/Polygon_mesh_processing/approximated_centroidal_Voronoi_diagram_remeshing.h>
|
||||||
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>
|
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>
|
||||||
#include <CGAL/Surface_mesh.h>
|
#include <CGAL/Surface_mesh.h>
|
||||||
|
#include <CGAL/Polyhedron_3.h>
|
||||||
|
|
||||||
#include <CGAL/Polygon_mesh_processing/triangulate_faces.h>
|
#include <CGAL/Polygon_mesh_processing/triangulate_faces.h>
|
||||||
#include <CGAL/Polygon_mesh_processing/bbox.h>
|
#include <CGAL/Polygon_mesh_processing/bbox.h>
|
||||||
|
|
@ -13,11 +14,12 @@
|
||||||
namespace PMP = CGAL::Polygon_mesh_processing;
|
namespace PMP = CGAL::Polygon_mesh_processing;
|
||||||
|
|
||||||
using K = CGAL::Exact_predicates_inexact_constructions_kernel;
|
using K = CGAL::Exact_predicates_inexact_constructions_kernel;
|
||||||
using Mesh = CGAL::Surface_mesh<K::Point_3>;
|
using Surface_mesh = CGAL::Surface_mesh<K::Point_3>;
|
||||||
typedef boost::graph_traits<Mesh>::vertex_descriptor vertex_descriptor;
|
using Polyhedron = CGAL::Polyhedron_3<K>;
|
||||||
|
|
||||||
namespace params = CGAL::parameters;
|
namespace params = CGAL::parameters;
|
||||||
|
|
||||||
|
template <class Mesh>
|
||||||
void run_test(std::string fname, std::size_t genus)
|
void run_test(std::string fname, std::size_t genus)
|
||||||
{
|
{
|
||||||
Mesh mesh;
|
Mesh mesh;
|
||||||
|
|
@ -44,19 +46,15 @@ void run_test(std::string fname, std::size_t genus)
|
||||||
assert(std::abs(bb.ymax()-bb_ref.ymax()) < 0.01 * dy);
|
assert(std::abs(bb.ymax()-bb_ref.ymax()) < 0.01 * dy);
|
||||||
assert(std::abs(bb.zmax()-bb_ref.zmax()) < 0.01 * dz);
|
assert(std::abs(bb.zmax()-bb_ref.zmax()) < 0.01 * dz);
|
||||||
|
|
||||||
std::ofstream("/tmp/out_"+std::to_string(genus)+".off") << mesh;
|
|
||||||
|
|
||||||
PMP::approximated_centroidal_Voronoi_diagram_remeshing(mesh, 4);
|
PMP::approximated_centroidal_Voronoi_diagram_remeshing(mesh, 4);
|
||||||
assert(-(vertices(mesh).size()-edges(mesh).size()+faces(mesh).size()-2)/2==genus);
|
assert(-(vertices(mesh).size()-edges(mesh).size()+faces(mesh).size()-2)/2==genus);
|
||||||
|
|
||||||
std::ofstream("/tmp/min_out_"+std::to_string(genus)+".off") << mesh;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
run_test(CGAL::data_file_path("meshes/tetrahedron.off"), 0);
|
run_test<Surface_mesh>(CGAL::data_file_path("meshes/tetrahedron.off"), 0);
|
||||||
run_test(CGAL::data_file_path("meshes/torus_quad.off"), 1);
|
run_test<Polyhedron>(CGAL::data_file_path("meshes/torus_quad.off"), 1);
|
||||||
run_test(CGAL::data_file_path("meshes/double-torus-example.off"), 2);
|
run_test<Surface_mesh>(CGAL::data_file_path("meshes/double-torus-example.off"), 2);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue