Исследуя этот вопрос, Мне придется иметь дело с фигурами, границы которых состоят из отрезков и дуг окружности. Кажется, CGAL должен быть в состоянии помочь мне здесь: Согласно этот раздел руководства пользователя, General_polygon_set_2
с Gps_segment_traits_2
поскольку его класс черт должен быть в состоянии выразить большинство операций, которые мне нужны, в частности пересечения и различия.
До сих пор я не нашел в документах способ применения жестких движений к этим фигурам и способ вычисления площади полученной фигуры.
Я думаю, я могу обойти обе проблемы. Для жестких движений я мог бы воссоздать форму после преобразования исходных определяющих объектов. И чтобы вычислить площадь, я мог бы использовать вариацию подхода шнурка, приспособленную для того, чтобы справляться с дугами окружности. Пример из руководства печатает подробности о поддерживающем круге и копает заголовки, которые я обнаружил, что каждый кривая для моих полигонов есть supporting_circle()
метод, так что я думаю, что это на самом деле Arr_circle_segment_traits_2<K>::X_monotone_curve_2
. Так что я должен быть в состоянии получить достаточно информации о круге, чтобы вычислить площадь. Я нашел это только в заголовках после использования преднамеренных сообщений об ошибках компилятора, чтобы узнать о типах некоторых объектов, которые просто описываются в руководстве как unspecified_type
,
Тем не менее, обе эти операции потребуют некоторой работы, и я удивлен, что, кажется, нет встроенного способа сделать это. С другой стороны, так как CGAL выполняет свои настройки с помощью аргументов шаблона, я мог бы просто упустить способ сделать это, работающий для круговых сегментов, хотя он может не работать для других общих многоугольников. Знаете ли вы какие-нибудь ярлыки, которые я мог бы использовать?
Боюсь, вам не понравится мой ответ.
Я разработчик CGAL, на самом деле один из разработчиков Reg. Булева операция и расстановка пакетов.
Во-первых, запрашиваемые вами операции не поддерживаются.
Что касается вычисления площади, ваш подход кажется осуществимым. Однако для нас будет огромным усилием потребовать такой операции в концепции, потому что тогда нам потребуется реализовать операцию для всех классов признаков, которые мы поддерживаем. Я думаю, всегда можно начать с одного, а затем добавить их один за другим. Я добавлю это в наш список задач, но я не ставлю свои ставки на быструю доставку …
Что касается преобразования, ответ является более сложным. Как вы уже заметили, применение неточного преобразования к (точной) геометрической форме (например, расположение, общий набор многоугольников или даже маленький линейный простой выпуклый многоугольник) может быть вредным. Вы должны придумать точное преобразование, например, матрицу преобразования, которая содержит числа точного типа — того же (или, по крайней мере, преобразуемого друг в друга) типа, который используется для представления (точных) координат геометрических элементов. Проблема, естественно, заключается в вращении, потому что вы обычно начинаете с угла и используете тригонометрические функции (например, sin () и cos ()) для вычисления матрицы вращения. Допустим, вы хотите повернуть на заданный угол, скажем, альфа. Вам необходимо вычислить аппроксимацию альфа, так что sin (альфа) и cos (альфа) являются рациональными числами, и, таким образом, могут быть представлены числами вышеупомянутого точного типа. Может помочь бесплатная функция CGAL ::ational_rotation_approximation (). Как упомянуто в ручном вводе этой функции, аппроксимация основана на последовательностях Фэри, как описано в методе рационального вращения, представленном Кэнни и Ресслером на 8-м совещании SoCG 1992.
Удачи!
Других решений пока нет …