2016-07-25 20 views
0

Ich möchte Verfeinerung von zB einem einfachen Würfel (von einem .off); Es gibt ein paar Möglichkeiten, aber diejenigen, die für das geeignet sind, was ich als nächstes machen möchte, enden mit "Falten", dh die Objektform wird verzerrt.Erzwingen Verfeinerung mit CGAL isotropic_remeshing

Auf diese Weise unten verspricht, die Grenzen (Form?) Des Objekts zu ermöglichen, zu erhalten, ermöglicht, was Sie von Verfeinerung erwarten würden, nur um mehr Kanten und Ecken hinzu:

http://doc.cgal.org/latest/Polygon_mesh_processing/Polygon_mesh_processing_2isotropic_remeshing_example_8cpp-example.html

I Ich möchte eine Edge-Constraint-Map (und wenn das nicht ausreicht, möchte ich auch eine Vertex-Constraint-Map), kann aber die Template-Abstraktionen nicht gut genug herausfinden. Ich habe versucht, eine OpenMesh Constrained_edge_map aus einem anderen CGAL-Beispiel, aber das ist zu unterschiedlich und wird nicht kompilieren. Was ich um eine Kantenkarte und vielleicht ein Vertex-Map, die ich auf den Anruf ernähren:

PMP::isotropic_remeshing( faces(mesh), target_edge_length, mesh, PMP::parameters::number_of_iterations(nb_iter) .protect_constraints(true)//i.e. protect border, here );

Ich bin mit CGAL 4.8.1, den neuesten zum Zeitpunkt des Schreibens. Vielen Dank.

+0

Welche Datenstruktur sind Sie für das Dreieck mit Netz? – sloriot

+0

Hier ist mein aktueller Versuch: http://pastebin.com/PcY1SLb8 Ich fahre fort, es als .stl zu schreiben. Mir war nicht bewusst, dass ich eine Dreiecksbildung durchführen musste, ich ging nach dem verlinkten Beispiel. Ich mache 'split_long_edges', aber ich bezweifle, dass du das meinst. – JDonner

Antwort

4

Hier ist ein minimales Beispiel einen triangulierter Würfel neu vernetzt:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> 
#include <CGAL/Surface_mesh.h> 
#include <CGAL/boost/graph/graph_traits_Surface_mesh.h> 
#include <CGAL/Polygon_mesh_processing/remesh.h> 
#include <CGAL/Mesh_3/dihedral_angle_3.h> 
#include <boost/foreach.hpp> 

typedef CGAL::Exact_predicates_inexact_constructions_kernel K; 
typedef CGAL::Surface_mesh<K::Point_3>    Mesh; 
typedef boost::graph_traits<Mesh>::halfedge_descriptor halfedge_descriptor; 
typedef boost::graph_traits<Mesh>::edge_descriptor edge_descriptor; 

namespace PMP=CGAL::Polygon_mesh_processing; 

int main(int, char* argv[]) 
{ 
    std::ifstream input(argv[1]); 
    Mesh tmesh; 
    input >> tmesh; 

    double target_edge_length = 0.20; 
    unsigned int nb_iter = 10; 

    // give each vertex a name, the default is empty 
    Mesh::Property_map<edge_descriptor,bool> is_constrained = 
    tmesh.add_property_map<edge_descriptor,bool>("e:is_constrained",false).first; 

    //detect sharp features 
    BOOST_FOREACH(edge_descriptor e, edges(tmesh)) 
    { 
    halfedge_descriptor hd = halfedge(e,tmesh); 
    if (!is_border(e,tmesh)){ 
     double angle = CGAL::Mesh_3::dihedral_angle(tmesh.point(source(hd,tmesh)), 
                tmesh.point(target(hd,tmesh)), 
                tmesh.point(target(next(hd,tmesh),tmesh)), 
                tmesh.point(target(next(opposite(hd,tmesh),tmesh),tmesh))); 
     if (CGAL::abs(angle)<100) 
     is_constrained[e]=true; 
    } 
    } 

    //remesh 
    PMP::isotropic_remeshing(
     faces(tmesh), 
     target_edge_length, 
     tmesh, 
     PMP::parameters::number_of_iterations(nb_iter) 
     .edge_is_constrained_map(is_constrained)); 

    std::ofstream out("out.off"); 
    out << tmesh; 
    return 0; 
} 
+0

Vielen Dank, das hat funktioniert! – JDonner