#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;
}
}
}
Если вы работаете с полигонами с отверстиями, то этот процесс следует повторить для всех отверстий. Приведенный выше пример является упрощением обработки пересечений — более полные примеры можно найти здесь .