德卡斯特里奥算法

✍ dations ◷ 2025-11-21 13:37:43 #算法,数值分析,样条

数学子领域数值分析中的德卡斯特里奥算法(英语: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

(该代码用到)

相关

  • 机器翻译机器翻译(英语:Machine Translation,经常简写为MT,简称机译)属于计算语言学的范畴,其研究借由计算机程序将文字或演说从一种自然语言翻译成另一种自然语言。简单来说,机器翻译是通
  • 自然出版集团自然出版集团(Nature Publishing Group)是一个出版科学期刊的国际出版公司。其总部位于英国伦敦,是英国麦克米伦出版公司的一个子公司,1995年英国麦克米伦出版公司被德国 霍尔茨
  • 升主动脉升主动脉(Aorta ascendens)为主动脉与左心室交接的部分,始于第三肋间软骨下缘,并沿胸骨左半边上行。升主动脉有左冠状动脉和右冠状动脉(英语:right coronary artery)两分支,供应心脏
  • 精子银行精子银行 (Sperm bank)是保存年轻男性精子的储存机构,精子放入银行暂时贮存,以备自己今后使用,或捐献他人使用。适用者包括夫妻两地分居者、少精症者或取精困难者、患病者、暂时
  • span class=nowrapAgsub2/subCsub2/sub/span>乙炔银是一种无机化合物,化学式为Ag2C2,是一种金属乙炔化合物。该化合物可被视为弱酸(乙炔)的盐。盐的阴离子是两个由三键相连的碳原子。乙炔银可以形成在银或高银合金的表面上,
  • 交点交点是指线与线、线与面相交的点。在几何学上(准确地说在欧几里德空间中),两条直线如非平行,必存在交点。引申下去,一切事物相交接的时间或空间,都可被称为交点。
  • 2017年亚洲U23男子排球锦标赛2017年亚洲U23男子排球锦标赛于5月1日至9日在伊朗阿尔达比勒举行。本赛事为2017年世界U23男子排球锦标赛的亚洲区资格赛,赛事前两名可取得世锦赛的参赛资格。
  • 穆罕默德六世 (奥斯曼帝国)穆罕默德六世(Mehmed VI,阿拉伯文: محمد السادس), 全名Mehmet Vahdettin 或Mehmed Vahideddin,)(1861年1月14日-1926年5月16日)奥斯曼帝国第三十六代也是末代苏丹(1918年
  • 巴西食品公司巴西食品公司(BRF S.A.) 是巴西的一家食品公司,2009年由Perdigão和Sadia联合组成。是世界上最大的食品公司之一。其业务遍布全球各地,在2013年8月改名前,该公司称BRF – Brasil
  • 鞍山电视台鞍山电视台创办于2002年,是由辽宁省人民政府批准的股份制企业,同年被评定为辽宁省高新技术企业。以党的方针政策为原则,以丰富群众精神文化生活为宗旨,发挥广播电视舆论导向的重