CGAL Новичок Вопрос: Какие сегменты пересекаются? - PullRequest
2 голосов
/ 28 октября 2010

У меня есть набор сегментов (каждый из которых определен двумя точками; 2D) и я хочу знать для каждого сегмента x, сколько других сегментов y1, ..., yn пересекаются с x. Как бы вы сделали это эффективно в CGAL?

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

Пример CGAL sweep_line.cpp показывает, как получить все точки пересечения множества o сегментов. Поскольку меня не интересуют точки, мне нужно будет проверить точки и сегменты, чтобы получить количество пересечений для каждого сегмента. Но я не знаю, как это сделать в CGAL. И я также предполагаю, что есть более эффективный способ сделать это; это означает: избегать вычисления точек и повторять все сегменты с новой проверкой, пересекает ли эта точка какую-либо найденную точку.

Есть советы? Спасибо за ваш вклад!

Sascha

PS: еще один быстрый вопрос новичка: почему результаты следующего печатаются с отрицательными знаками?

Segment_2 segments[] = {Segment_2  (Point_2 (1, 5), Point_2 (8, 5)),
                              Segment_2 (Point_2 (1, 1), Point_2 (8, 8)),
                              Segment_2 (Point_2 (3, 1), Point_2 (3, 8)),
                              Segment_2 (Point_2 (8, 5), Point_2 (8, 8))};

      std::vector<Point_2>     pts;

      CGAL::compute_intersection_points (segments, segments + 4,
                                         std::back_inserter (pts));

Найдено 3 точки пересечения: -21 / -7 -21 / -7 -3 / -1 -5 / -1 -35 / -7 -35 / -7

PS2: Я понял, что в моем заголовке и моих первых строках не описана та же проблема. Мне не нужно знать, какие сегменты пересекаются с x, а только количество сегментов, как описано в тексте.

1 Ответ

1 голос
/ 27 июля 2011

Вы можете применить функцию do_intersect к двум сегментам.

Более подробную информацию можно найти здесь: http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Kernel_23_ref/Function_do_intersect.html

...