• 【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 = {Pi,k=0(1t)Pk1i+tPk1i+1,k=1,2,,n;i=0,1,,nk

    Pik={Pi,k=0(1t)Pik1+tPi+1k1,k=1,2,,n;i=0,1,,nk

  • 相关阅读:
    MySQL索引、事务与存储引擎
    U盾难管理?用U盾专用USB集线器
    Zookeeper安装
    梯度裁剪:torch.nn.utils.clip_grad_norm_详解
    昨参观宋庆龄故居
    Spring基础知识总结(纯文字版)
    Linux安全—iptables详解(概念和filter表)
    Spring中使用自带@Autowired注解实现策略模式
    AWS DynamoDB使用
    误差卡尔曼中的四元数运动学
  • 原文地址:https://blog.csdn.net/han1202012/article/details/126038577