CGAL 中的标尺和圆规构造
Ruler and Compass construction in CGAL
我正在尝试使用 CGAL 构建 "get intersection of a line and circle"、"connect two points"、"create a circle" 等基本结构。不过kernel的选择好像是个问题。当我使用精确的 2D 圆形内核时,我从交叉点得到 Circular_arc_point_2
,然后我不能使用这种数据类型来创建线、圆;并转换为 Point_2
似乎会引入错误,然后将近似值存储为精确数字。另外这个问题似乎与内核的选择无关。
这些构造的正确方法是什么?只要这些结构中的数据类型一致,精确和近似的数字都可以。
在最坏的情况下,如果这无法解决,是否有任何其他具有此功能的免费库?
Circular_arc_point_2
是一个坐标为2次代数数的点(只能表示2个圆的交点)。您可以使用例如 Point_2(to_double(cp.x()), to_double(cp.y()))
将点转换为常规浮点坐标 Point_2
,但这样您将失去准确性。
预定义的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());
我正在尝试使用 CGAL 构建 "get intersection of a line and circle"、"connect two points"、"create a circle" 等基本结构。不过kernel的选择好像是个问题。当我使用精确的 2D 圆形内核时,我从交叉点得到 Circular_arc_point_2
,然后我不能使用这种数据类型来创建线、圆;并转换为 Point_2
似乎会引入错误,然后将近似值存储为精确数字。另外这个问题似乎与内核的选择无关。
这些构造的正确方法是什么?只要这些结构中的数据类型一致,精确和近似的数字都可以。 在最坏的情况下,如果这无法解决,是否有任何其他具有此功能的免费库?
Circular_arc_point_2
是一个坐标为2次代数数的点(只能表示2个圆的交点)。您可以使用例如 Point_2(to_double(cp.x()), to_double(cp.y()))
将点转换为常规浮点坐标 Point_2
,但这样您将失去准确性。
预定义的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());