openGL参数曲线-----三次贝塞尔曲线

openGL系列文章目录

文章目录

前言

我们现在将曲线模型扩展到4 个控制点,就会得到一个三次贝塞尔曲线,如图11.4 所
示。与二次曲线相比,三次贝塞尔曲线能够定义的形状更加丰富,而二次曲线仅限于定义
凹形。
《openGL参数曲线-----三次贝塞尔曲线》
图1
同二次曲线时的情形,我们可以推导出三次贝塞尔曲线的解析定义:
《openGL参数曲线-----三次贝塞尔曲线》
曲线上的点则是:
《openGL参数曲线-----三次贝塞尔曲线》
使用p12−23 和p01−12 的定义替换等式中的项,再合并得:
《openGL参数曲线-----三次贝塞尔曲线》
渲染贝塞尔曲线时,可以使用许多不同的技术。其中一种方法是,使用固定的增量,在
0.0~1.0 范围内,迭代增加得出t 的后继值。例如,当增量为0.1 时,我们可以使用t 值为
0.0、0.1、0.2、0.3 等的循环。对于t 的每个值,计算贝塞尔曲线上的对应点,并绘制连接
连续点的一系列线段,如图11.5 中的算法所述。
另一种方法是使用de Casteljau 算法递归地将曲线对半细分,其中,在每个递归步骤t =
1/2。图1 展示了左侧曲线细分后的新三次控制点(q0,q1,q2,q3),以绿色显示(见彩
插)。该算法由de Casteljau 提出(完整推导见[AS14])。
算法见图11.7。该算法重复将曲线段细分为两半的过程,直到每个曲线段足够直,进一
步的细分不会产生实际的好处。在极限情况下(随着生成的控制点越来越靠近),曲线段本
身实际上与第一个控制点和最后一个控制点(q0 和q3)之间的线段相同。因此,可以通过
比较从第一控制点到最后一个控制点的距离与连接4 个控制点的3 条线段的长度之和来确 定曲线段是否“足够直”
《openGL参数曲线-----三次贝塞尔曲线》
《openGL参数曲线-----三次贝塞尔曲线》
图4 贝塞尔曲线迭代算法
《openGL参数曲线-----三次贝塞尔曲线》
图5.细分三次贝塞尔曲线
当D1−D2 小于一个足够小的阈值时,进一步的细分就没有意义了。
de Casteljau 算法有一个有趣的特性,它可以在不使用之前描述的混合函数的情况下,生
成曲线上所有的点。同时请注意,p(1/2)处的中心点是“共享”的,即它既是左细分中最右
的控制点,也是右细分中最左的控制点。它可以使用t = 1/2 处的混合函数或使用由de
Casteljau 导出的公式(q2 + r1)/2 来计算。
另请注意,图11.7 中所示的subdivide()函数假定传入的参数p、q 和r 是“引用”参数,
因此,图11.7 上方列出的drawBezierCurve 函数对于subdivide()的调用,导致subdivide()函
数中的计算修改了调用中所传的实际参数。
《openGL参数曲线-----三次贝塞尔曲线》

    原文作者:妙为
    原文地址: https://blog.csdn.net/aoxuestudy/article/details/123307433
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞