Существует ли функция CGAL для нахождения всех точек пересечения между 2D-линией (Line_2) и набором 2D-полигонов с отверстиями (Polygon_with_holes_2)?

#c #cgal

#c #cgal

Вопрос:

У меня есть строка от 0, 0 до 1024, 0. Многие полигоны с отверстиями лежат между двумя концами линий. Я хотел бы знать, существует ли какая-либо функция CGAL, которая может указать мне все точки пересечения между отрезком линии и всеми полигонами с отверстиями.

В качестве альтернативы, на данный момент также достаточно функции для пересечения между линией и одним полигоном с отверстиями. Эта функция должна была бы сообщить мне все точки, в которых линия пересекается с многоугольником с отверстиями.

Ответ №1:

Ответ — нет. Функции пересечения для полигонов работают только с двумя полигонами, а смысл пересечения — это кусок плоскости, состоящий из точек, лежащих внутри обоих полигонов. Если вы хотите найти точки пересечения для сегмента и границы полигона — вам нужно извлечь все граничные ребра одно за другим и вычислить все пересечения одно за другим. Пример приведен ниже:

 #include <iostream>
#include <vector>

#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Polygon_2.h>

using Kernel = CGAL::Exact_predicates_exact_constructions_kernel;
using Polygon = CGAL::Polygon_2<Kernel>;
using Point = Polygon::Point_2;
using Segment = Polygon::Segment_2;

int main()
{
  // ------ define segment
  const Segment s{{-1000, 0}, {1000, 0}};
  // ------ define polygon
  const std::vector<Point> pts{{3, 3}, {-3, 3}, {-3, -3}, {3, -3}};
  const Polygon p(pts.cbegin(), pts.cend());
  // ------ find all intersections of the segment with polygon edges
  for (auto eit = p.edges_begin(); eit != p.edges_end();   eit)
  {
    const auto res = CGAL::intersection(s, *eit);
    if (res)
    {
      const auto pt = boost::get<Point>(amp;*res);
      std::cout << *pt << std::endl;
    }
  }
}
 

Если вы работаете с полигонами с отверстиями, то этот процесс следует повторить для всех отверстий. Приведенный выше пример является упрощением обработки пересечений — более полные примеры можно найти здесь .