unity3D中贝塞尔曲线的控制点计算

       一、贝塞尔曲线的概念 

        对于两点之间的连线,我们可以用直线进行连接效果如下:

        其中的每一个F点都在AB连接的线段上

        这就是一阶贝塞尔曲线unity3D中贝塞尔曲线的控制点计算_第1张图片

       

如果我们加入一个控制点C,那么做图如下:unity3D中贝塞尔曲线的控制点计算_第2张图片

       1、连接AC,BC

        2、在AC,BC上找到 AD/AC = CE/CB 的点D,E

        3、连接DE,在DE上寻找点F,F点需要满足:EF/ ED = AD/AC = CE/CB

        4、找出所有F点,连接而成的线,就是贝塞尔曲线

       两个线段根据等比关系找点的贝塞尔曲线,一般也称为二阶贝塞尔曲线。

       关于贝赛尔曲线的基本数学理论大概就是上面的内容。

       除了二阶贝塞尔曲线外还有三阶,四阶贝塞尔曲线,它们的控制点依次增加,我们常用的是三阶贝塞尔曲线,有两个控制点,控制点决定着生成完成后曲线的形状。

      三阶贝塞尔曲线的绘制示意图如下:

unity3D中贝塞尔曲线的控制点计算_第3张图片

     1、首先连接AC,AB,BD

     2、找到EFG三点,满足 AE/AC = BF/BA = DG/DB

     3、连接EF.FG

     4、找到J,I两点,满足 AE/AC = BF/BA = DG/DB = FJ/FE = GI/GF

     5、连接JI两点

     6、找到H点,满足AE/AC = BF/BA = DG/DB = FJ/FE = GI/GF = IH/IJ

     7、F点从A移动到B,所计算出的H点连成的线,就是三阶贝塞尔曲线

二、三阶贝塞尔曲线控制点的计算方法

        介绍完了什么是贝塞尔曲线,现在来说遇到的问题:

        现在已知有A,B.C.D,E,F,G,H点若干个,假如它们直线连接如下unity3D中贝塞尔曲线的控制点计算_第4张图片

       可以看出,连接直线并不平滑,在连接点上会出现方向突变。

       如果想要生成光滑曲线,需要进行控制点计算,计算出A,B,C,D,E,F,H各个带你的控制点进行计算

       每个位置要计算出左右两个控制点L1,L2:

算法如下:

1、两端的控制点位置为自己本身,例如A点控制点位置L1=L2=A ,G点 L1=L2=G

2、中间控制点的位置由左右两个点的位置决定,例如C点的控制点位置通过计算BCD连接而成的三角形决定

3、计算向量\underset{CB}{\rightarrow}\underset{CD}{\rightarrow} 与三角形BCD的夹角\angle BCD  ,

4、计算垂直于三角形BCD所在平面的单位向量\underset{CF}{\rightarrow},计算方法为\underset{CB}{\rightarrow}\underset{CD}{\rightarrow}的向量积,再归一化

5、向量\underset{CB}{\rightarrow}\underset{CF}{\rightarrow}轴旋转 (^{180^{0}} - \angle BCD)/ 2 度 得到向量\underset{C^{D{'}}}{\rightarrow}

6、向量\underset{CD}{\rightarrow}\underset{CF}{\rightarrow}轴旋转 -(^{180^{0}} - \angle BCD)/ 2 度得到向量  \underset{C^{B{'}}}{\rightarrow}

7、将5,6计算结果乘以一个比例因子\lambda的到向量CL1 与CL2(\lambda的大小决定曲线的形状,一般设置在0.5以下)

8、L1坐标 = CL1 + C , L2坐标 = CL2 + C

    \angle BCD如果为180度,那么跳过4,5,6步的计算

unity3D中贝塞尔曲线的控制点计算_第5张图片

三、代码实现

      暂无

 

你可能感兴趣的:(c#编程,算法,贝塞尔曲线)