确认CGAL halfspace_intersection_with_construction_3()是否全不精确运行的问询
我要对比自研算法和CGAL半空间相交算法的性能。我的自研算法用double类型运算,点、线都是不精确构造,用的也是不精确谓词。为了公平对比,我需要CGAL全程基于double类型,做不精确构造和谓词运算。
我选了Simple_cartesian<double>内核,用它定义平面,输出网格是该内核点类型的Surface_mesh,然后调用halfspace_intersection_with_construction_3()函数。但我不确定这样配置是不是真的能让CGAL全程走不精确运算——毕竟它和用exact_predicates_inexact_constructions内核的版本速度几乎一样,我怀疑CGAL会不会自动转成精确运算来保证鲁棒性。
另外我不清楚traits类的工作机制,想问下是否需要传入traits类参数?
回答
Simple_cartesian<double>的运算逻辑:这个内核是完全基于double的不精确实现,所有构造操作和谓词判断都会直接使用double浮点运算,CGAL不会自动切换到精确运算路径。内核是CGAL几何计算的基础,你的选择会被严格遵循,不存在“无视配置自动转精确”的情况。速度接近的原因:
exact_predicates_inexact_constructions内核的谓词采用精确计算(比如通过过滤机制用整数运算避免浮点误差),但构造仍用double。如果你的测试用例中,平面坐标的数值没有触发大量需要精确修正的歧义场景(比如点刚好在平面上、平面近乎平行等),精确谓词的额外开销极低,因此和Simple_cartesian<double>的运行速度差异就会很小。traits类的作用与是否需要传入:traits类是CGAL算法的核心接口,它定义了算法依赖的几何类型(如
Point_3、Plane_3)和基础操作(如谓词函数、构造函数)。当你调用halfspace_intersection_with_construction_3()时,若不传入traits参数,算法会自动推导你传入的几何对象(比如Simple_cartesian<double>定义的平面)所属的内核作为traits实现。所以你当前的配置已经足够,无需额外传入traits类。验证不精确运算的方法:可以通过调试查看中间生成的点坐标,或者添加日志输出构造结果——如果所有点的坐标都是普通double值(无精确有理数表示),就说明CGAL确实在执行不精确运算。
内容的提问来源于stack exchange,提问作者Merve A

