CGAL: помощь в получении координат треугольников из триангуляции Делоне

Я новичок в CGAL, уверен, что мой вопрос очень простой.

Я пытаюсь использовать CGAL для выполнения некоторой триангуляции Делоне. У меня есть сетка с N трехмерными точками над сферой, и я хочу триангулировать сферу, используя эти точки в качестве вершин треугольников. Мне просто нужно получить список вершин таких треугольников:

id_triangle1 вершина_1 вершина_2 вершина_3 id_triangle2 вершина_1 вершина_2 вершина_3 .......

Я сделал это для выполнения триангуляции:

    std::vector<Point> P; 
    for(i=0;i<NSPOINTS;i++) 
            P.push_back(Point(GRID[i].x,GRID[i].y,GRID[i].z)); 

    // building Delaunay triangulation. 
    Delaunay dt(P.begin(), P.end()); 

Проблема в том, что я не знаю, как получить итоговую триангуляцию. Я понял, как получить face_iterator, но не знаю, что оттуда делать:

    Delaunay::Finite_faces_iterator it; 
    for (it = dt.finite_faces_begin(); it != dt.finite_faces_end(); it++){ 
            std::cout << dt.triangle(it) << std::endl; 
    } 

Я не уверен, правильно ли это перебирать треугольники, и если это ... треугольник = лицо ?? ¿, я имею в виду, что каждая позиция итератора имеет только треугольник¿? Как я могу правильно получить x, y и z каждого треугольника¿? ¿


person horstmann    schedule 29.10.2011    source источник


Ответы (2)


Как описано здесь, Facet представляет собой пару (Cell_handle , int). Целое число указывает индекс ячейки напротив фасета. Таким образом, получить доступ к точкам фасета можно так: it->first->vertex( (it->second+k)%4 )->point() с k = 1-> 3.

Обратите внимание, что если вас интересует триангуляция сферы (то есть триангуляция поверхности), вам нужно рассматривать только фасеты, инцидентные бесконечной ячейке. Кроме того, использование выпуклой оболочки решает эту проблему, см. Этот пример.

person sloriot    schedule 31.10.2011
comment
Спасибо за быстрый ответ, но я до сих пор не знаю, как перебирать получившиеся треугольники и как получить индексы вершин каждого треугольника. Как я уже сказал, мне нужно что-то вроде этого: треугольник_1 v1 v2 v3 треугольник_2 v1 v3 v4 треугольник_3 v2 v4 v5 ...... и так далее. (На данный момент меня интересуют не координаты вершин x, y, z, а их индексы) Заранее спасибо. - person horstmann; 31.10.2011
comment
Последующие действия находятся здесь: cgal-discuss.949826.n4.nabble.com/ - person gsamaras; 14.04.2016

Если вы загуглите Finder_faces_begin (), вы сможете получить много подсказок CGAL.

Итератор лиц позволит вам получить доступ к базовым данным разными способами. Вот хороший пример того, что называется «tesis», в котором используется функция «vertex ()».

http://mati-repa-repo.googlecode.com/svn/trunk/tesis/impl/HODTs/

for( Finite_faces_iterator fi = dt.finite_faces_begin(); fi != dt.finite_faces_end(); fi++){
    Point2 point0 = Point2(fi->vertex(0)->point().hx(), fi->vertex(0)->point().hy());
    Point2 point1 = Point2(fi->vertex(1)->point().hx(), fi->vertex(1)->point().hy());
    Point2 point2 = Point2(fi->vertex(2)->point().hx(), fi->vertex(2)->point().hy());
    ...
}

Удачи.

person don bright    schedule 06.08.2014