Построение линейки и компаса в CGAL
Я пытаюсь создать базовые конструкции, такие как "получить пересечение линии и круга", "соединить две точки", "создать круг" с помощью CGAL. Тем не менее, выбор ядра кажется проблемой. Когда я использую точное 2D кольцевое ядро, я получаю Circular_arc_point_2
из пересечений, и тогда я не могу использовать этот тип данных для создания линий, кругов; и преобразование в Point_2
кажется, вводит ошибку, а затем сохраняет приблизительное значение как точное число. Кроме того, эта проблема, кажется, не зависит от выбора ядра.
Как правильно строить эти конструкции? Точное и приблизительное число все в порядке, если тип данных согласован в этих конструкциях. В худшем случае, если это неразрешимо, существует ли какая-либо другая бесплатная библиотека с такой функциональностью?
2 ответа
Circular_arc_point_2
является точкой, координатами которой являются алгебраические числа степени 2 (единственный способ точно представить пересечение 2 окружностей). Вы можете преобразовать точку в обычную координату с плавающей точкой Point_2
используя, например, Point_2(to_double(cp.x()), to_double(cp.y()))
но тогда вы потеряете точность.
Предопределенный Exact_circular_kernel_2
в качестве типа поля используется только рациональное число. Чтобы покрыть каждую конструктивную точку, вы должны определить круговое ядро, которое использует FieldWithSqrt
, С существующими типами и признаками это просто:
using L = CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt;
using A = CGAL::Algebraic_kernel_for_circles_2_2<L::FT>;
using K = CGAL::Circular_kernel_2<L, A>;
Тогда вы можете преобразовать Circular_arc_point_2 p
в Point_2
с точными координатами:
K::Point_2 q(p.x(), p.y());