#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
.