`

Bezier曲线的de Casteljau算法证明

    博客分类:
  • JAVA
阅读更多

ezier曲线(又称貝茲曲線或贝塞尔曲线)的定义和性质请看维基百科貝茲曲線。它的定义是:

其中,

,约定00 = 1.

 

e Casteljau算法揭示了Bezier数学上很美的一个性质,我八成相信是先有了这个性质,才有了上面的定义式,当然它们是等价的。首先来看维基百科中的三张图:

二次Bezier曲线

三次Bezier曲线:

四次Bezier曲线:

这三张图展现了Bezier曲线漂亮的数学性质。图中的参数变量t的从0增长到1,红色的线就是Bezier曲线,Bezier曲线上的任一个点(t),都是其它相邻线段的同等比例(t)点处的连线,再取同等比例(t)的点再连线,一直取到最后那条线段的同等比例(t)处,该点就是Beizer曲线上的点(t). 以二次Bezier曲线为例,如该曲线上的1/3点,就是线段P0P1取1/3点,P1P2取1/3点,两点连线,再取其1/3点处即是。这就是de Casteljau算法提出来的,其数学表达式是:

上式中,k表示第k层,以四次Bezier曲线为例,k=0时,就是灰色线段,k=1时,就是绿色线段,k=2就是蓝色线段,一直递推下去就是Bezier上的点(t)了。于是用de Casteljau算法很容易求出Bezier曲线上的任一点(t)的位置。换一种图示的方法表示这种递推关系:

这是用几何画板画的,很难看,解释一下。左边一列是原来(k=0)的控制顶点,第二列是(k=1)的控制顶点,以此类推。每个箭头表示两个点分别乘以1-t和t并加起来,得到右边的点。这样一直做到最后的点就是Bezier上的点(t).

先看P0的系数为什么是,因为每次P0都是乘以(1-t)传到右边的点,这样一直传了n次到达最右端。仔细看一下就可以发现,最左边的点传递到最右边,是靠乘以一系列的t或1-t到达的,那么Pi的系数就是Pi走到最右边左右的"路"的系数之和。比如,P0只能一直走斜下的边,而且只有一条路,记住能不往左走,因此它的系数就是。那么P1的系数就是,因为它到最右边有两条路,且t和1-t的次数是一样的。可以发现每个Pi的每条路的t和1-t的次数都是一样的,而路的条数的系数很熟悉。没错,把上图逆时钟转90°就是杨辉三角了。

杨辉三角有这样的特征:每个数字表示从顶点走下来到该点不同走法的数目,而且无论是哪条路走到该点,向左和向右的次数是一样的,等于该点的二次多项式展开系数。

到了这里,如果看懂了的话,我想已经证明了,剩下就是一些说明性言语了。数学美还没结束,见下图:

 

绿色线按顺序排列的点P0到P0n这n个点可以画出一条n次Bezier曲线,记为B1;蓝色的n个点也可以画出一条n次Bezier曲线;这两条曲线直接接起来,就是原来P0到Pn画出的n次Bezier曲线!神奇吧,它们居然有类似向量的性质。实际应用也是用这个性质,一般取t=1/2,将一条Bezier曲线变成两条小的,再继续分下去,当Bezier曲线足够小时就可以用线段代替曲线了。这个性质同样可以证明,但写到网上很麻烦就不写了,大家推荐好一点的数学画图软件,谢谢。数学有时很美。

 

 

 

 

 

分享到:
评论

相关推荐

    bezier曲线decasteljau算法程序代码,计算机运行完好

    bezier曲线decasteljau算法程序代码,计算机运行完好 可以用记事本打开查看算法。

    de Casteljau算法绘制Bezier曲线

    在这里,我们将深入探讨de Casteljau算法及其在绘制Bezier曲线中的应用。 首先,让我们理解什么是贝塞尔曲线。贝塞尔曲线由一组控制点定义,其中最简单的是二阶(直线)和三阶(三次)贝塞尔曲线。对于n阶曲线,...

    Bezier曲线生成算法(C++实现)

    在C++中实现Bezier曲线生成算法,通常会涉及到向量数学、矩阵运算以及递归方法。 首先,理解Bezier曲线的基本概念至关重要。一条Bezier曲线由n个控制点P0, P1, ..., Pn所决定,其中n+1称为曲线的阶数。对于一个二阶...

    使用de Casteljau 算法的bez曲线实现

    de Casteljau算法是求解和绘制贝塞尔曲线的一种有效方法,尤其在计算复杂曲线时效率较高。本篇文章将深入探讨de Casteljau算法及其在MFC(Microsoft Foundation Classes)框架中的实现。 首先,让我们了解什么是...

    Bezier曲线MFC实现源代码

    3. **De Casteljau算法**:这是计算Bezier曲线的一种常用方法,通过递归地将高阶曲线分解为低阶曲线,直至得到线性曲线,然后线性插值得到最终的曲线点。 4. **绘制曲线**:在MFC的设备上下文中,你可以使用`MoveTo...

    用vc++实现Bezier曲线

    实现Bezier曲线的关键算法是De Casteljau算法,这是一种递归算法,用于计算任意阶Bezier曲线在特定参数值下的点。在VC++中,可以使用C++的数据结构(如vector)存储控制点,并通过该算法计算出曲线上的任意点。在每...

    Bezier曲线的生成算法

    Bezier曲线的生成算法基于De Casteljau算法,也称为线性插值。这个算法通过递归地将高次Bezier曲线分解为多个较低次的Bezier曲线,直到最后得到线性曲线段,然后将这些线性段组合起来形成最终的曲线。对于二次Bezier...

    Bezier-Curves:使用De Casteljau和Bernstein Bezier绘制Bezier曲线并创建旋转曲面的程序集

    程式1:DeCasteljau.cpp 实现了de Castlejau算法,用于评估整个2D Bezier曲线。 程式2:Bernstein.cpp 实施任意程度的2D Bezier曲线的Bernstein形式。 如果用户输入(n + 1)点,则曲线将为n度。 程序3:...

    1_smoothgv7_绘制Bezier曲线_

    描述中的"de Casteljau算法"是计算Bezier曲线的一种经典方法,由贝尔尼尔·德卡斯特尔焦提出,适用于任意阶的Bezier曲线。 Bezier曲线的基本思想是通过一组控制点来定义曲线。对于一个n阶的Bezier曲线,它由n+1个...

    图形学 Bezier曲线的递推(de Casteljau)算法

    private double t=0.0,ts=0.0; private double px[][]=new double[999][999]; private double py[][]=new double[999][999]; private int i=0,j=0,k,x,y,sum=0; private Button button_Caste,button_Clear,...

    计算机图形学-Bezier曲线算法定义

    Bezier曲线的计算通常使用De Casteljau算法,这是一个递归过程。该算法将高阶曲线拆分为一系列二阶曲线,直到每个二阶曲线都可以简单地用两个点之间的线段表示。这个过程保证了曲线在每个控制点处都具有连续的切线,...

    基于MATLAB动态实现Bezier曲线几何作图.pdf

    DeCasteljau算法是计算Bezier曲线的一种递归算法,它通过不断分割控制多边形的边,使用线段比和控制点的关系递归地构造出Bezier曲线上的点。在DeCasteljau算法中,通过给定参数u(范围通常在0到1之间)来决定曲线上...

    VB实现Bezier曲线.rar

    在这个项目中,我们利用VB来实现Bezier曲线,主要依赖于deCasteljau算法。 Bezier曲线的基本概念: Bezier曲线是由法国工程师Pierre Bézier首次引入的,它是一种参数化的线性组合,由一系列控制点决定。在二维空间...

    基本算法bezier曲线

    在VC++中,我们可以利用基本算法来实现Bezier曲线的绘制。这篇文章将详细讲解Bezier曲线的理论基础,以及如何在VC++环境中用C++语言实现其绘制。 Bezier曲线的核心是伯恩斯坦多项式,它是由法国工程师Pierre Bé...

    Bezier曲线代码 java

    总结起来,Bezier曲线是一种强大的工具,Java程序员可以通过实现De Casteljau算法来处理和绘制这些曲线。这个压缩包中的"Bezier"文件很可能是实现Bezier曲线计算和绘制的Java类或函数,供开发者在自己的项目中复用和...

    OpenGL绘制三次Bezier曲线

    De Casteljau算法是一种常用的Bezier曲线计算算法,它可以将Bezier曲线转换为-parametric形式,从而便于计算曲线上的点。 在本文的示例代码中,我们首先定义了四个控制点,然后使用getRatio函数计算曲线上的点。...

    利用opengl绘制的Bezier曲线

    Bezier曲线的基本原理是基于 Bernstein多项式,这种多项式构成了一种叫做De Casteljau算法的基础,该算法用于高效地计算曲线的任意位置。 在C++ MFC环境下,首先需要设置OpenGL环境,包括初始化窗口、创建OpenGL上...

Global site tag (gtag.js) - Google Analytics