Merge branch 'EigenDecimator' into 'master'
Eigen decimator See merge request OpenMesh/OpenMesh!244
This commit is contained in:
@@ -29,6 +29,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li>Subdivider: Fixed crash in Loop subdivider</li>
|
<li>Subdivider: Fixed crash in Loop subdivider</li>
|
||||||
<li>Subdivider: Fixed crash in ModifiedButterfly subdivider</li>
|
<li>Subdivider: Fixed crash in ModifiedButterfly subdivider</li>
|
||||||
|
<li>Decimater: Fixed ModNormalDeviationT not working for meshes with Eigen Vectors as vector type</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <OpenMesh/Core/Geometry/VectorT.hh>
|
#include <OpenMesh/Core/Geometry/VectorT.hh>
|
||||||
|
#include <OpenMesh/Core/Utils/vector_traits.hh>
|
||||||
|
|
||||||
|
|
||||||
//== NAMESPACES ===============================================================
|
//== NAMESPACES ===============================================================
|
||||||
@@ -77,13 +78,14 @@ namespace OpenMesh {
|
|||||||
the center normal and the opening angle.
|
the center normal and the opening angle.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
template <typename Scalar>
|
template <typename Vector>
|
||||||
class NormalConeT
|
class NormalConeT
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// typedefs
|
// typedefs
|
||||||
typedef VectorT<Scalar, 3> Vec3;
|
typedef typename vector_traits<Vector>::value_type Scalar;
|
||||||
|
typedef Vector Vec3;
|
||||||
|
|
||||||
|
|
||||||
//! default constructor (not initialized)
|
//! default constructor (not initialized)
|
||||||
|
|||||||
@@ -70,8 +70,8 @@ namespace OpenMesh {
|
|||||||
|
|
||||||
//== IMPLEMENTATION ==========================================================
|
//== IMPLEMENTATION ==========================================================
|
||||||
|
|
||||||
template <typename Scalar>
|
template <typename Vector>
|
||||||
NormalConeT<Scalar>::
|
NormalConeT<Vector>::
|
||||||
NormalConeT(const Vec3& _center_normal, Scalar _angle)
|
NormalConeT(const Vec3& _center_normal, Scalar _angle)
|
||||||
: center_normal_(_center_normal), angle_(_angle)
|
: center_normal_(_center_normal), angle_(_angle)
|
||||||
{
|
{
|
||||||
@@ -81,9 +81,9 @@ NormalConeT(const Vec3& _center_normal, Scalar _angle)
|
|||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
template <typename Scalar>
|
template <typename Vector>
|
||||||
Scalar
|
typename NormalConeT<Vector>::Scalar
|
||||||
NormalConeT<Scalar>::
|
NormalConeT<Vector>::
|
||||||
max_angle(const Vec3& _norm) const
|
max_angle(const Vec3& _norm) const
|
||||||
{
|
{
|
||||||
Scalar dotp = (center_normal_ | _norm);
|
Scalar dotp = (center_normal_ | _norm);
|
||||||
@@ -95,9 +95,9 @@ max_angle(const Vec3& _norm) const
|
|||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
template <typename Scalar>
|
template <typename Vector>
|
||||||
Scalar
|
typename NormalConeT<Vector>::Scalar
|
||||||
NormalConeT<Scalar>::
|
NormalConeT<Vector>::
|
||||||
max_angle(const NormalConeT& _cone) const
|
max_angle(const NormalConeT& _cone) const
|
||||||
{
|
{
|
||||||
Scalar dotp = (center_normal_ | _cone.center_normal_);
|
Scalar dotp = (center_normal_ | _cone.center_normal_);
|
||||||
@@ -112,12 +112,12 @@ max_angle(const NormalConeT& _cone) const
|
|||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
template <typename Scalar>
|
template <typename Vector>
|
||||||
void
|
void
|
||||||
NormalConeT<Scalar>::
|
NormalConeT<Vector>::
|
||||||
merge(const NormalConeT& _cone)
|
merge(const NormalConeT& _cone)
|
||||||
{
|
{
|
||||||
Scalar dotp = (center_normal_ | _cone.center_normal_);
|
Scalar dotp = dot(center_normal_, _cone.center_normal_);
|
||||||
|
|
||||||
if (fabs(dotp) < 0.99999f)
|
if (fabs(dotp) < 0.99999f)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ public:
|
|||||||
typedef typename Mesh::VertexHandle VertexHandle;
|
typedef typename Mesh::VertexHandle VertexHandle;
|
||||||
typedef typename Mesh::FaceHandle FaceHandle;
|
typedef typename Mesh::FaceHandle FaceHandle;
|
||||||
typedef typename Mesh::EdgeHandle EdgeHandle;
|
typedef typename Mesh::EdgeHandle EdgeHandle;
|
||||||
typedef NormalConeT<Scalar> NormalCone;
|
typedef NormalConeT<Normal> NormalCone;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include <Unittests/unittests_common.hh>
|
#include <Unittests/unittests_common.hh>
|
||||||
#include <OpenMesh/Tools/Decimater/DecimaterT.hh>
|
#include <OpenMesh/Tools/Decimater/DecimaterT.hh>
|
||||||
#include <OpenMesh/Tools/Decimater/ModQuadricT.hh>
|
#include <OpenMesh/Tools/Decimater/ModQuadricT.hh>
|
||||||
|
#include <OpenMesh/Tools/Decimater/ModNormalDeviationT.hh>
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
@@ -49,7 +50,7 @@ TEST_F(OpenMeshDecimater, DecimateMesh) {
|
|||||||
decimaterDBG.initialize();
|
decimaterDBG.initialize();
|
||||||
size_t removedVertices = 0;
|
size_t removedVertices = 0;
|
||||||
removedVertices = decimaterDBG.decimate_to(5000);
|
removedVertices = decimaterDBG.decimate_to(5000);
|
||||||
decimaterDBG.mesh().garbage_collection();
|
decimaterDBG.mesh().garbage_collection();
|
||||||
|
|
||||||
EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
|
EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
|
||||||
EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
|
EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
|
||||||
@@ -72,7 +73,7 @@ TEST_F(OpenMeshDecimater, DecimateMeshToFaceVerticesLimit) {
|
|||||||
decimaterDBG.initialize();
|
decimaterDBG.initialize();
|
||||||
size_t removedVertices = 0;
|
size_t removedVertices = 0;
|
||||||
removedVertices = decimaterDBG.decimate_to_faces(5000, 8000);
|
removedVertices = decimaterDBG.decimate_to_faces(5000, 8000);
|
||||||
decimaterDBG.mesh().garbage_collection();
|
decimaterDBG.mesh().garbage_collection();
|
||||||
|
|
||||||
EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
|
EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
|
||||||
EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
|
EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
|
||||||
@@ -95,7 +96,7 @@ TEST_F(OpenMeshDecimater, DecimateMeshToFaceFaceLimit) {
|
|||||||
decimaterDBG.initialize();
|
decimaterDBG.initialize();
|
||||||
size_t removedVertices = 0;
|
size_t removedVertices = 0;
|
||||||
removedVertices = decimaterDBG.decimate_to_faces(4500, 9996);
|
removedVertices = decimaterDBG.decimate_to_faces(4500, 9996);
|
||||||
decimaterDBG.mesh().garbage_collection();
|
decimaterDBG.mesh().garbage_collection();
|
||||||
|
|
||||||
EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
|
EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
|
||||||
EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
|
EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
|
||||||
@@ -103,6 +104,34 @@ TEST_F(OpenMeshDecimater, DecimateMeshToFaceFaceLimit) {
|
|||||||
EXPECT_EQ(9996u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
|
EXPECT_EQ(9996u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST_F(OpenMeshDecimater, DecimateMeshToVertexLimitWithLowNormalDeviation) {
|
||||||
|
|
||||||
|
bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
|
||||||
|
|
||||||
|
ASSERT_TRUE(ok);
|
||||||
|
|
||||||
|
typedef OpenMesh::Decimater::DecimaterT< Mesh > Decimater;
|
||||||
|
typedef OpenMesh::Decimater::ModQuadricT< Mesh >::Handle HModQuadric;
|
||||||
|
typedef OpenMesh::Decimater::ModNormalDeviationT< Mesh >::Handle HModNormalDeviation;
|
||||||
|
|
||||||
|
Decimater decimaterDBG(mesh_);
|
||||||
|
HModQuadric hModQuadricDBG;
|
||||||
|
decimaterDBG.add( hModQuadricDBG );
|
||||||
|
HModNormalDeviation hModNormalDeviation;
|
||||||
|
decimaterDBG.add( hModNormalDeviation );
|
||||||
|
decimaterDBG.module(hModNormalDeviation).set_normal_deviation(15.0);
|
||||||
|
decimaterDBG.initialize();
|
||||||
|
size_t removedVertices = 0;
|
||||||
|
removedVertices = decimaterDBG.decimate_to(8);
|
||||||
|
decimaterDBG.mesh().garbage_collection();
|
||||||
|
|
||||||
|
EXPECT_EQ(6998u, removedVertices) << "The number of remove vertices is not correct!";
|
||||||
|
EXPECT_EQ( 528u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
|
||||||
|
EXPECT_EQ(1578u, mesh_.n_edges()) << "The number of edges after decimation is not correct!";
|
||||||
|
EXPECT_EQ(1052u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(OpenMeshDecimater, DecimateMeshExampleFromDoc) {
|
TEST_F(OpenMeshDecimater, DecimateMeshExampleFromDoc) {
|
||||||
|
|
||||||
bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
|
bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
|
||||||
@@ -121,7 +150,7 @@ TEST_F(OpenMeshDecimater, DecimateMeshExampleFromDoc) {
|
|||||||
decimaterDBG.initialize();
|
decimaterDBG.initialize();
|
||||||
size_t removedVertices = 0;
|
size_t removedVertices = 0;
|
||||||
removedVertices = decimaterDBG.decimate_to_faces(4500, 9996);
|
removedVertices = decimaterDBG.decimate_to_faces(4500, 9996);
|
||||||
decimaterDBG.mesh().garbage_collection();
|
decimaterDBG.mesh().garbage_collection();
|
||||||
|
|
||||||
EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
|
EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
|
||||||
EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
|
EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
|
||||||
|
|||||||
@@ -7,6 +7,9 @@
|
|||||||
|
|
||||||
#include <OpenMesh/Core/Mesh/Traits.hh>
|
#include <OpenMesh/Core/Mesh/Traits.hh>
|
||||||
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
|
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
|
||||||
|
#include <OpenMesh/Tools/Decimater/DecimaterT.hh>
|
||||||
|
#include <OpenMesh/Tools/Decimater/ModQuadricT.hh>
|
||||||
|
#include <OpenMesh/Tools/Decimater/ModNormalDeviationT.hh>
|
||||||
|
|
||||||
#include <OpenMesh/Core/Geometry/EigenVectorT.hh>
|
#include <OpenMesh/Core/Geometry/EigenVectorT.hh>
|
||||||
|
|
||||||
@@ -232,6 +235,37 @@ TEST_F(OpenMeshEigenTest, LoadSimpleOFFFile) {
|
|||||||
mesh_.update_normals();
|
mesh_.update_normals();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test decimation with Eigen as vector type
|
||||||
|
TEST_F(OpenMeshEigenTest, Decimater) {
|
||||||
|
mesh_.clear();
|
||||||
|
|
||||||
|
bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
|
||||||
|
|
||||||
|
EXPECT_TRUE(ok);
|
||||||
|
|
||||||
|
EXPECT_EQ(7526u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!";
|
||||||
|
EXPECT_EQ(22572u, mesh_.n_edges()) << "The number of loaded edges is not correct!";
|
||||||
|
EXPECT_EQ(15048u, mesh_.n_faces()) << "The number of loaded faces is not correct!";
|
||||||
|
|
||||||
|
mesh_.update_normals();
|
||||||
|
|
||||||
|
OpenMesh::Decimater::DecimaterT<EigenTriMesh> decimater(mesh_);
|
||||||
|
OpenMesh::Decimater::ModQuadricT<EigenTriMesh>::Handle hModQuadric; // use a quadric module
|
||||||
|
OpenMesh::Decimater::ModNormalDeviationT<EigenTriMesh>::Handle hModNormalDeviation; // also use normal deviation module as binary check
|
||||||
|
decimater.add(hModQuadric);
|
||||||
|
decimater.add(hModNormalDeviation);
|
||||||
|
decimater.module(hModQuadric).unset_max_err();
|
||||||
|
decimater.module(hModNormalDeviation).set_normal_deviation(15);
|
||||||
|
decimater.initialize();
|
||||||
|
size_t removedVertices = decimater.decimate_to(8);
|
||||||
|
mesh_.garbage_collection();
|
||||||
|
|
||||||
|
EXPECT_EQ(6998u, removedVertices) << "The number of remove vertices is not correct!";
|
||||||
|
EXPECT_EQ( 528u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
|
||||||
|
EXPECT_EQ(1578u, mesh_.n_edges()) << "The number of edges after decimation is not correct!";
|
||||||
|
EXPECT_EQ(1052u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user