7 几何Traits
几何Traits封装了几何实体的定义以及处理这些几何实体的几何predicates和构造的实现,由Arrangement_on_surface_2类模板和其他周边模块使用。应用于Arrangement的各种算法所确定的最小要求被组织在精细几何特征概念的层次中。每个概念列出的需求只包括实现特定算法所需的完全必要的类型和操作。这种模块化结构产生了可控制的部件,这些部件可以毫不费力地生产、维护和使用。对于每个操作,还指定了其操作数必须满足的所有先决条件,因为这些先决条件可以进一步简化这些概念的模型的实现。每个特征类对一个或多个概念进行建模。本节详细描述了精化层次结构中的概念以及为这些概念建模的各种特性类。
构造和操纵Arrangement所需的所有代数都集中在特征类中。设计一个好的特性类所需的知识与开发包的其余部分或使用包所需的信息大不相同。它与计算几何的关系不大,主要涉及代数和数值计算。通过这种方式,可以在几乎不了解计算几何中的算法和数据结构的情况下开发新型曲线的特征类。在本节中,我们将讨论如何使用现有的traits类,但我们也将解释这些traits类模型的概念——这是每个此类新手开发人员的起点。
本节分为三个部分。第一部分描述了排列几何特征的细化层次概念。第二部分回顾了这些概念的各种模型。这些特征类处理不同的曲线族,例如线段、多段线、圆锥弧、贝塞尔曲线、代数曲线和球体上的测地线弧。最后一部分介绍了几何特征类的装饰器。traits类的装饰器将辅助数据附加到由原始traits类处理的几何对象,从而扩展它。
7.1 几何特征模板概念
7.1.1 基本概念
compare_x_2: 比较两个点的x坐标大小
compare_xy_2: 比较两点的字典序大小,首先x坐标,如果x坐标相同,就比较y坐标
7.1.2 相交
改进的Model需要支持下面附加的操作:
Split_2: 通过一个给定的在曲线上的点,分割一个X单调的曲线成2个子曲线
Are_mergeable_2: 判断2个x-monotone的曲线是否能合并成一个连续的x-monotone的曲线
Merge_2: Split_2的逆操作
Intersect_2:
7.1.3 支持任意曲线
ArrangementTraits_2
改进了ArrangementXMonotoneTraits_2,可以支持非X单调的曲线。比如圆,它会把圆切分成上半弧和下半弧,这个concept也支持如下额外的操作:
Make_x_monotone_2: 切分一个Curve_2类型的普遍曲线为2个弱x单调的曲线和弧立点
7.1.4 Landmark Concept
一个ArrangementApproximateTraits_2模型要支持下面的操作:
Approximate_2: 给定一个点p,使用不一定是多精度的数字类型来近似p的x和y坐标。我们将此操作用于近似计算——在搜索点的位置过程中执行的某些操作不需要精确,并且在执行时可以更快地执行,例如,使用固定精度的数字类型。
一个 ArrangementConstructXMonotoneCurveTraits_2
模型要支持下面的操作:
Construct_x_monotone_curve_2: 给定两点p1和p2,构造连接p1和p2的x单调曲线