Как получить индекс треугольника, используя tree.any_intersection

#cgal

#cgal

Вопрос:

Допустим, у нас есть набор треугольников 1,2, …, N и отрезок линии. Создавая дерево, я хочу получить пересечение отрезка линии с треугольниками и индекс треугольника, который пересекает отрезок линии (есть только один). Как я вызываю это из «пересечения» ниже?

Спасибо.

 for (int i=0; i<NumTriangles; i  ) {
    Point a(Triangles[i].vert1[0], Triangles[i].vert1[1], Triangles[i].vert1[2]);
    Point b(Triangles[i].vert2[0], Triangles[i].vert2[1], Triangles[i].vert2[2]);
    Point c(Triangles[i].vert3[0], Triangles[i].vert3[1], Triangles[i].vert3[2]);
    triangles.push_back(Triangle(a,b,c));
}
Tree tree(triangles.begin(),triangles.end());
Point a(0,0,0);
Point a(0,0,1);
Segment segment_query(a,b);
Segment_intersection intersection = tree.any_intersection(segment_query);
 

Ответ №1:

Каждый треугольник, который вы помещаете в три, называется примитивом. Этот примитив имеет уникальный идентификатор (также известный как ID) и геометрию (datum, здесь треугольник).

Тип идентификатора примитива определяется параметром шаблона класса CGAL::AABB_primitive . Если вы используете CGAL::AABB_triangle_primitive , который является просто упрощенным API CGAL:AABB_primitive , то идентификатор является итератором, ссылающимся на примитив в пределах диапазона triangles .

Функция any_intersection() возвращает необязательный объект, представляющий собой пару, содержащую как геометрию пересечения (as first ), так и пересекаемый примитив (as second ), из которого вы можете получить идентификатор с id() помощью функции.