基数样条

基数样条是一连串连接起来形成较大曲线的单独的曲线。 基数样条由点的数组和张力参数指定。 基数样条流畅地穿过数组中的每个点;没有尖锐的角,并且曲线的紧绷性没有突然的变化。 下图显示了一组点以及穿过其中每个点的一条基数样条。

显示通过六个定义点的基数样条的插图

物理样条是一块薄木头或其他柔性材料。 在数学样条出现之前,设计师使用物理样条来绘制曲线。 设计师会将样条放在一张纸上,并将它定位成给定的一组点。 然后,设计师可以通过用铅笔沿样条绘制曲线来创建曲线。 给定的一组点可能会产生各种曲线,具体视物理样条的属性而定。 例如,抗弯曲性较高的样条会产生与极度柔韧的样条不同的曲线。

数学样条的公式基于柔性杆的属性,因此,由数学样条生成的曲线类似于曾经由物理样条生成的曲线。 就像张力不同的物理样条将产生穿过给定的一组点的不同曲线一样,张力参数值不同的数学样条将产生穿过给定的一组点的不同的曲线。 下图显示了穿过同一组点的四条基数样条。 显示了每条基数样条的张力。 请注意,0 的紧张度对应于无限的物理紧张度,迫使曲线以最短的方式 (点之间的直线) 。 张力为 1 对应于没有物理张力,使样条采用最小完全弯曲的路径。 在张力值大于 1 的情况下,曲线的行为类似于压缩的弹簧,被挤压为采取更长的路径。

显示通过同一三个点的四个基数样条的插图

请注意,上图中的四条样条在起点处共享相同的正切线。 切线是从起点到下一个点沿曲线绘制的线条。 同样,终点处共享的切线是从终点到曲线上的前一个点绘制的线条。

若要绘制基数样条,需要 一个 Graphics 对象、 一个 Pen 对象和一个 Point 对象数组。 Graphics 对象提供 DrawCurve 方法,该方法绘制样条,Pen 对象存储样条的属性,如线条宽度和颜色。 Point 对象的数组存储曲线将通过的点。 以下示例绘制一条通过 myPointArray 中的点的基数样条。 第三个参数是张力。

myGraphics.DrawCurve(&myPen, myPointArray, 3, 1.5f);