如何定位CGAL中Construct_point_on_3的具体实现代码?
Construct_point_on_3的具体实现代码 1. 定位目标Kernel的实现路径
你使用的Exact_predicates_inexact_constructions_kernel属于CGAL核心内核模块,对应的核心头文件路径为:include/CGAL/Kernel/Exact_predicates_inexact_constructions_kernel.h
这个内核继承自Cartesian<double>模板(因为它是inexact类型,采用double作为数值类型FT),所有构造相关的functor都由Cartesian内核模板提供。
2. 追踪construct_point_on_3_object()的来源
在Cartesian内核的实现文件include/CGAL/Cartesian/Cartesian_kernel.h中,可以找到construct_point_on_3_object()的定义:
template < typename FT_, typename Kernel_, typename Vector_, typename Point_ > class Cartesian_base { // ... Construct_point_on_3 construct_point_on_3_object() const { return Construct_point_on_3(); } // ... };
它返回的Construct_point_on_3就是我们要找的functor类型。
3. 查看Construct_point_on_3的具体实现
这个functor的代码位于include/CGAL/Cartesian/Construct_point_on_3.h,核心逻辑如下:
template < typename Kernel > class Construct_point_on_3 { public: typedef typename Kernel::Point_3 Point_3; typedef typename Kernel::Line_3 Line_3; typedef typename Kernel::Vector_3 Vector_3; Point_3 operator()(const Line_3& l, const typename Kernel::FT& t) const { return l.point(0) + t * l.direction().vector(); } };
这里的逻辑很明确:传入直线l和参数t时,返回的是直线起点(l.point(0))加上t倍的方向向量。这就是为什么你调用时传入t=0会得到固定点——它返回的是直线的起点,而非随机的“任意点”。文档里的“任意”指的是可以通过调整t值获取直线上的任意点,而非随机返回。
4. 验证Cylinder::axis()的调用逻辑
在Cylinder.h中,axis()方法调用m_traits.construct_point_on_3_object()(l, 0),这里固定传入t=0,所以必然返回直线的起点,这就是你看到点并非“任意”的原因。
内容的提问来源于stack exchange,提问作者BernB

