【Android UI】贝塞尔曲线 ⑤ ( 德卡斯特里奥算法 | 贝塞尔曲线递推公式 )


贝塞尔曲线参考 : https://github.com/venshine/BezierMaker





一、德卡斯特里奥算法



贝塞尔曲线的 三阶 / 四阶 / 五阶 曲线的绘制 , 都是依赖于其低阶贝塞尔曲线实现的 ,

三阶贝塞尔曲线 是由 二阶贝塞尔曲线 实现的 ,

四阶贝塞尔曲线 是由 三阶贝塞尔曲线 实现的 ;


德卡斯特里奥算法 可以实现 贝塞尔曲线 降阶的效果 ;

下面开始介绍 德卡斯特里奥算法 ;


在 向量 A B AB AB 上 选择 C C C 点 ,

C C C 点将 A B AB AB 向量切割成比例为 u : 1 − u u : 1- u u:1u ,

也就是 A A A C C C 的距离 ∣ A C ∣ |AC| AC , 与 A A A B B B 的距离 ∣ A B ∣ |AB| AB , 其比值为 u u u , 写成公式就是如下形式 :

∣ A C ∣ : ∣ A B ∣ = u |AC| : |AB| = u AC:AB=u

在这里插入图片描述


A A A B B B 的距离 ∣ A B ∣ |AB| AB 全长为 1 1 1 ,

A A A C C C 的距离 ∣ A C ∣ |AC| AC 比例占到全长的 u u u , u u u 的取值范围是 0 0 0 ~ 1 1 1 之间的浮点值 ,

C C C B B B 的距离 ∣ C B ∣ |CB| CB 比例占到全长的 1 − u 1-u 1u ;

在这里插入图片描述


再回到贝塞尔曲线中 ,

在这里插入图片描述

上图是 P 0 P_0 P0 P 2 P_2 P2 的 二阶 贝塞尔曲线 , P 0 P_0 P0 是起始点 , P 2 P_2 P2 是终止点 , P 1 P_1 P1 是控制点 ;

首先 通过 一阶等式 , 在 P 0 P_0 P0 P 1 P_1 P1 之间确定出 P 0 1 P_0^1 P01 点 , P 0 P_0 P0 P 0 1 P_0^1 P01 点占 整个 P 0 P_0 P0 P 1 P_1 P1 的比例为 u u u ;

然后 通过 一阶等式 , 在 P 1 P_1 P1 P 2 P_2 P2 之间确定出 P 1 1 P_1^1 P11 点 , P 1 P_1 P1 P 1 1 P_1^1 P11 点占 整个 P 1 P_1 P1 P 2 P_2 P2 的比例为 u u u ;

最后 通过 一阶等式 , 在 P 0 1 P_0^1 P01 P 1 1 P_1^1 P11 之间确定出 P 0 2 P_0^2 P02 点 , P 0 1 P_0^1 P01 P 0 2 P_0^2 P02 点占 整个 P 0 1 P_0^1 P01 P 1 1 P_1^1 P11 的比例为 u u u ;


最终得到如下等式 :

P 0 P 0 1 P 0 1 P 1 = P 1 P 1 1 P 1 1 P 2 = P 0 1 P 0 2 P 0 2 P 1 1 = u \cfrac{P_0P_0^1}{P_0^1P_1} = \cfrac{P_1P_1^1}{P_1^1P_2} = \cfrac{P_0^1P_0^2}{P_0^2P_1^1} = u P01P1P0P01=P11P2P1P11=P02P11P01P02=u


u u u 0 0 0 ~ 1 1 1 进行变化时 , P 0 2 P_0^2 P02 点形成的曲线就是 二阶贝塞尔曲线 ;

请添加图片描述
( 网上找的图片 , 图片中的 t t t 也就是上面说的比例 u u u )


二阶贝塞尔曲线中的 P 0 2 P_0^2 P02 点 ,

由 起始点 P 0 P_0 P0 到 控制点 P 1 P_1 P1 组成的向量 , 和 由 控制点 P 1 P_1 P1 到 终止点 P 2 P_2 P2 组成的向量 ,

这两个向量 根据比例 u u u 决定的 一阶贝塞尔曲线 P 0 1 P_0^1 P01 P 1 1 P_1^1 P11 向量 根据比例 u u u 确定的 ,

也就是 P 0 2 P_0^2 P02一阶贝塞尔曲线 P 0 1 P_0^1 P01 P 1 1 P_1^1 P11 向量 确定 ;


上述操作 , 将 二阶贝塞尔曲线 , 降阶成了 一阶贝塞尔曲线 ;





二、贝塞尔曲线递推公式



由上面的结论进行类推 :

二阶贝塞尔曲线 ( 起止点 + 1 1 1 个控制点 ) 由 2 2 2 条 一阶贝塞尔曲线 确定 ,

三阶贝塞尔曲线 ( 起止点 + 2 2 2 个控制点 ) 由 2 2 2 条 二阶贝塞尔曲线 确定 ,

四阶贝塞尔曲线 ( 起止点 + 3 3 3 个控制点 ) 由 2 2 2 条 三阶贝塞尔曲线 确定 ,

⋮ \vdots

n n n阶贝塞尔曲线 ( 起止点 + n − 1 n-1 n1 个控制点 ) 由 2 2 2 n − 1 n-1 n1 阶贝塞尔曲线 确定 ;


贝塞尔曲线递推公式如下 :

P i k = { P i , k = 0 ( 1 − t ) P i k − 1 + t P i + 1 k − 1 , k = 1 , 2 , ⋯   , n ; i = 0 , 1 , ⋯   , n − k P_i^k = \begin{cases} P_i , k = 0\\ (1-t)P_i^{k-1} + tP_{i + 1}^{k-1} , k = 1,2,\cdots,n ; i = 0,1,\cdots,n-k \end{cases} Pik={ Pi,k=0(1t)Pik1+tPi+1k1,k=1,2,,n;i=0,1,,nk

猜你喜欢

转载自blog.csdn.net/han1202012/article/details/126038577