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算法程序代码,计算机运行完好 可以用记事本打开查看算法。
在这里,我们将深入探讨de Casteljau算法及其在绘制Bezier曲线中的应用。 首先,让我们理解什么是贝塞尔曲线。贝塞尔曲线由一组控制点定义,其中最简单的是二阶(直线)和三阶(三次)贝塞尔曲线。对于n阶曲线,...
在C++中实现Bezier曲线生成算法,通常会涉及到向量数学、矩阵运算以及递归方法。 首先,理解Bezier曲线的基本概念至关重要。一条Bezier曲线由n个控制点P0, P1, ..., Pn所决定,其中n+1称为曲线的阶数。对于一个二阶...
de Casteljau算法是求解和绘制贝塞尔曲线的一种有效方法,尤其在计算复杂曲线时效率较高。本篇文章将深入探讨de Casteljau算法及其在MFC(Microsoft Foundation Classes)框架中的实现。 首先,让我们了解什么是...
3. **De Casteljau算法**:这是计算Bezier曲线的一种常用方法,通过递归地将高阶曲线分解为低阶曲线,直至得到线性曲线,然后线性插值得到最终的曲线点。 4. **绘制曲线**:在MFC的设备上下文中,你可以使用`MoveTo...
实现Bezier曲线的关键算法是De Casteljau算法,这是一种递归算法,用于计算任意阶Bezier曲线在特定参数值下的点。在VC++中,可以使用C++的数据结构(如vector)存储控制点,并通过该算法计算出曲线上的任意点。在每...
Bezier曲线的生成算法基于De Casteljau算法,也称为线性插值。这个算法通过递归地将高次Bezier曲线分解为多个较低次的Bezier曲线,直到最后得到线性曲线段,然后将这些线性段组合起来形成最终的曲线。对于二次Bezier...
程式1:DeCasteljau.cpp 实现了de Castlejau算法,用于评估整个2D Bezier曲线。 程式2:Bernstein.cpp 实施任意程度的2D Bezier曲线的Bernstein形式。 如果用户输入(n + 1)点,则曲线将为n度。 程序3:...
描述中的"de Casteljau算法"是计算Bezier曲线的一种经典方法,由贝尔尼尔·德卡斯特尔焦提出,适用于任意阶的Bezier曲线。 Bezier曲线的基本思想是通过一组控制点来定义曲线。对于一个n阶的Bezier曲线,它由n+1个...
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曲线的计算通常使用De Casteljau算法,这是一个递归过程。该算法将高阶曲线拆分为一系列二阶曲线,直到每个二阶曲线都可以简单地用两个点之间的线段表示。这个过程保证了曲线在每个控制点处都具有连续的切线,...
DeCasteljau算法是计算Bezier曲线的一种递归算法,它通过不断分割控制多边形的边,使用线段比和控制点的关系递归地构造出Bezier曲线上的点。在DeCasteljau算法中,通过给定参数u(范围通常在0到1之间)来决定曲线上...
在这个项目中,我们利用VB来实现Bezier曲线,主要依赖于deCasteljau算法。 Bezier曲线的基本概念: Bezier曲线是由法国工程师Pierre Bézier首次引入的,它是一种参数化的线性组合,由一系列控制点决定。在二维空间...
在VC++中,我们可以利用基本算法来实现Bezier曲线的绘制。这篇文章将详细讲解Bezier曲线的理论基础,以及如何在VC++环境中用C++语言实现其绘制。 Bezier曲线的核心是伯恩斯坦多项式,它是由法国工程师Pierre Bé...
总结起来,Bezier曲线是一种强大的工具,Java程序员可以通过实现De Casteljau算法来处理和绘制这些曲线。这个压缩包中的"Bezier"文件很可能是实现Bezier曲线计算和绘制的Java类或函数,供开发者在自己的项目中复用和...
De Casteljau算法是一种常用的Bezier曲线计算算法,它可以将Bezier曲线转换为-parametric形式,从而便于计算曲线上的点。 在本文的示例代码中,我们首先定义了四个控制点,然后使用getRatio函数计算曲线上的点。...
Bezier曲线的基本原理是基于 Bernstein多项式,这种多项式构成了一种叫做De Casteljau算法的基础,该算法用于高效地计算曲线的任意位置。 在C++ MFC环境下,首先需要设置OpenGL环境,包括初始化窗口、创建OpenGL上...