2016-07-25 2 views
0

Я хотел бы сделать уточнение, например, простого куба (от .off); есть несколько способов, но те, которые подходят для того, что я хочу сделать, заканчиваются «морщинами», т. е. форма объекта искажается.Уточненное уточнение с помощью CGAL isotropic_remeshing

Таким образом, ниже обещает разрешить границы (форма?) Объекта должны быть сохранены, позволяя то, что вы ожидали бы уточнения, чтобы просто добавить больше ребер и вершин:

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

I требуется карта ограничения границ (и если этого недостаточно, мне также понадобится карта ограничений вершин), но она не может точно определить абстракции шаблона. Я попробовал OpenMesh Constrained_edge_map из другого примера CGAL, но это слишком отличается и не будет компилироваться. То, что я прошу это край карты и, возможно отображение вершин, что я могу кормить к вызову:

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

Я использую CGAL 4.8.1, самая последняя на момент написания. Благодарю.

+0

Какие данные вы используете для треугольника сетки? – sloriot

+0

Вот моя текущая попытка: http://pastebin.com/PcY1SLb8 Я продолжаю пытаться записать ее как .stl. Я не знал, что мне нужно треуготься, я шел по связанному примеру. Я делаю «split_long_edges», но я сомневаюсь, что это то, что вы имеете в виду. – JDonner

ответ

4

Вот минимальный пример перерасчета триангулированную куб:

структура
#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

Спасибо, что сработало! – JDonner

Смежные вопросы