Извлечение нормалей CGALTriangulation

#c #geometry #cgal #triangulation

#c #геометрия #cgal #триангуляция

Вопрос:

В 3D CGALTriangulation я пытаюсь получить нормали таким образом

     Vector n = CGAL::normal(p1, p2, p3);
  

Код в контексте:

 for (CGALTriangulation::Finite_facets_iterator it = T.finite_facets_begin();
             it != T.finite_facets_end();
             it  )
        {
            std::pair<CGALTriangulation::Cell_handle, int> f = *it;
            
            const Pointtamp; p0 = f.first->vertex((f.second))->point();
            
            const Pointtamp; p1 = f.first->vertex((f.second 1)amp;3)->point();
            const Pointtamp; p2 = f.first->vertex((f.second 2)amp;3)->point();
            const Pointtamp; p3 = f.first->vertex((f.second 3)amp;3)->point();
  

Редактировать

 for (auto f : T.finite_facets())
{

    //all convex hull facets pointing outside
    if (T.is_infinite(T.mirror_facet(f).first)){
        f = T.mirror_facet(f);
    }

    const auto cell = f.first;
    const int i = f.second;
        
    const Pointamp; p1 = cell->vertex( T.vertex_triple_index(i, 0) )->point();
    const Pointamp; p2 = cell->vertex( T.vertex_triple_index(i, 1) )->point();
    const Pointamp; p3 = cell->vertex( T.vertex_triple_index(i, 2) )->point();

    Vector n = CGAL::normal(p1, p2, p3);
}
  

Комментарии:

1. Итератор по трем вершинам с vertex_triple_index дает правильную ориентацию фасета, видимого из cell . Если вам нужна заданная ориентация (например, на выпуклой оболочке), вам все равно придется выбирать между двумя представлениями фасета: f или T.mirror_facet(f) .

2. Вам нужно вычислять нормаль только для граней выпуклой оболочки?

3. Нет, я вычисляю все нормали для конечных граней. Но когда нормаль выпуклой оболочки не направлена наружу, более наглядно видно: я создаю шейдер cristal…

4. Вы должны представлять все грани дважды, по одному разу для каждой из двух сторон грани.

Ответ №1:

Ориентация фасета не может быть найдена таким образом. Чтобы установить p1 , p2 , и p3 , используйте этот фрагмент кода:

 const auto cell = f.first;
const int i = f.second;

const Pointtamp; p1 = cell->vertex(T.vertex_triple_index(i, 0)->point();
const Pointtamp; p2 = cell->vertex(T.vertex_triple_index(i, 1)->point();
const Pointtamp; p3 = cell->vertex(T.vertex_triple_index(i, 2)->point();
  

Смотрите документацию vertex_triple_index .