德卡斯特里奥算法

✍ dations ◷ 2025-11-19 00:38:40 #算法,数值分析,样条

数学子领域数值分析中的德卡斯特里奥算法(英语:De Casteljau's algorithm),以发明者保尔·德·卡斯特里奥命名,是计算伯恩斯坦形式的多项式或贝塞尔曲线的递归方法。

虽然对于大部分的体系结构,该算法和直接方法相比较慢,但它在数值上更为稳定。

贝兹曲线(角度为,控制点 β 0 , , β n {\displaystyle \beta _{0},\ldots ,\beta _{n}} 为伯恩施坦基本多项式(英语:Bernstein polynomial)

曲线在0点上可以用递推关系式运算

然后, B {\displaystyle B} 0来计算波恩斯坦多项式时,我们可以用三角形形式的两个对角线来构造多项式的分段表示。

把它变成

以及

我们要计算2次波恩斯坦多项式,其伯恩斯坦系数为

0点计算。

我们有下式开始递归

递归的第二次重复结束于

这就是我们所预料的n阶伯恩斯坦多项式。

在计算带+1个控制点P的三维空间中的次贝塞尔曲线 (Bézier curve) 时

其中

我们把Bézier曲线分成三个分立的方程

然后我们用de Casteljau算法分别计算。

这是一个递归的画出一条从点到,弯向和的曲线的伪代码例子。参数是递归的次数。该过程用增加了的参数来递归的调用它自己。当达到这个全局变量时,在和之间就画上直线。函数去两个点,并返回这两点间的线段的中点。

    global max_level = 5    procedure draw_curve(P1, P2, P3, P4, level)        if (level > max_level)            draw_line(P1, P4)        else            L1 = P1            L2 = midpoint(P1, P2)            H  = midpoint(P2, P3)            R3 = midpoint(P3, P4)            R4 = P4            L3 = midpoint(L2, H)            R2 = midpoint(R3, H)            L4 = midpoint(L3, R2)            R1 = L4            draw_curve(L1, L2, L3, L4, level + 1)            draw_curve(R1, R2, R3, R4, level + 1)    end procedure draw_curve

代码实现

Haskell

用线性插值计算P和Q之间的一点R,插值参数为t用法:linearInterp P Q t          P = 代表一个点的表          Q = 代表一个点的表          t = 线性插值的参数值, t<-返回:代表点(1-t)P + tQ的表>	linearInterp :: ->->Float->>	linearInterp   _ = >	linearInterp (p:ps) (q:qs) t = (1-t)*p + t*q : linearInterp ps qs t计算一对控制点间的线性插值的中间结果用法:eval t b          t = 线性插值的参数值, t<-          b = 控制点的表返回:对n个控制点,返回n-1个插值点的表>	eval :: Float->]->]>	eval t(bi:bj:)= >	eval t (bi:bj:bs) = (linearInterp bi bj t) : eval t (bj:bs)用de Casteljau算法计算Bezier曲线上一点用法:deCas t b          t = 线性插值的参数值, t<-          b = 控制点的表返回:代表Bezier曲线上一个点的列表>	deCas :: Float->]->>	deCas t(bi:)= bi>	deCas t bs = deCas t (eval t bs)用de Casteljau算法计算沿着Bezier曲线的一系列点。点用一个列表返回。用法:bezierCurve n b         n = 要计算的点的个数         b = Bezier控制点列表返回:Bezier曲线上n+1个点例子:bezierCurve 50 <nowiki>,,,]</nowiki>>	bezierCurve :: Int->]->]>	bezierCurve n b =  ]

Python

(该代码用到)

相关

  • 观察员截至2012年,联合国大会共有64个观察员。当中包含2个观察员国、4个观察员实体、和58个观察员组织。联合国在联合国会员国之外,还设有观察员制度,邀请国际组织、非政府组织、实体
  • 双盲双盲是科学方法的一种,目的是避免研究结果受安慰剂效应或观察者偏向所影响。在各种科学研究领域中,从医学、食品、心理到社会科学及法证都有使用双盲方法进行实验。单盲(Single
  • 列宾伊利亚·叶菲莫维奇·列宾(俄语:Илья Ефимович Репин;乌克兰语:Ілля Юхимович Рєпін,1844年8月5日-1930年9月29日),俄罗斯现实主义画家,巡回展览
  • 马德堡马格德堡(Magdeburg)位于易北河畔,是德国萨克森-安哈尔特州的首府,它是本州仅次于哈雷的第二大城市,也是本州三个无属县城市之一。马格德堡是基督教和天主教的主教教区首邑,拥有两
  • 邓昌黎邓昌黎(1926年9月5日-),物理学家,台湾中央研究院院士。生于北京,祖籍福建福州市,其兄为已故著名小提琴家邓昌国。少年时代就读北平私立志成中学。1946年北平辅仁大学物理学士。 194
  • 贝纳迪诺·里瓦达维亚贝纳迪诺·德拉·特里尼达德·冈萨雷斯·里瓦达维亚·伊·里瓦达维亚(Bernardino de la Trinidad Gónzalez Rivadavia y Rivadavia,1780年5月20日-1845年9月2日),阿根廷共和国第
  • 碧海蓝天 (电影)《碧海蓝天》(法语:Le Grand Bleu),是法国电影导演卢·贝松于1988年完成与首映的经典作品。情节讲述法国知名潜者贾克马攸(Jacques Mayol)的故事,但多为虚构情节。其风格有别于新浪
  • 史蒂文·斯皮尔伯格最佳导演 1993年 《辛德勒的名单》 1998年 《拯救大兵瑞恩》 金球奖终身成就奖 2008年史蒂文·艾伦·斯皮尔伯格,KBE(英语:Steven Allan Spielberg,1946年12月18日-),生于美国
  • 蒂莫西·弗朗茨·盖特纳蒂莫西·弗朗兹·盖特纳(英语:Timothy Franz Geithner,1961年8月18日-),美国经济学家,第75任美国财政部部长(2009年1月26日-2013年1月26日)。毕业于曼谷国际学校,后考入达特茅斯学院,于1
  • 加齐·切莱比加齐·切莱比(土耳其语:Gazi Çelebi,其名号意为“勇士绅士”)是鲁姆苏丹国权臣佩瓦内·穆尔因丁·苏莱曼的后代,他于14世纪初期的前数十年统治著黑海沿岸的锡诺普港口,同时也是位