我正在尝试制作基本结构,例如"得到一条线和圆的交叉点","连接两个点","创建一个圆"与CGAL。但是,内核的选择似乎是一个问题。当我使用精确的2D圆形内核时,我从交叉点得到Circular_arc_point_2
,然后我就不能使用这种数据类型来创建线条,圆圈;转换为Point_2
似乎会引入错误,然后将近似值存储为确切的数字。此外,这个问题似乎与内核的选择无关。
这些建筑的正确方法是什么?只要数据类型在这些结构中是一致的,精确数和近似数都是正确的。 在最坏的情况下,如果这是不可解析的,是否还有其他任何具有此功能的免费库?
答案 0 :(得分:0)
Circular_arc_point_2
是坐标是度数2的代数数字的唯一点(仅表示2个圆的交点)。您可以使用例如Point_2
将点转换为常规浮点坐标Point_2(to_double(cp.x()), to_double(cp.y()))
,但之后您将失去准确性。
答案 1 :(得分:0)
预定义的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());