德卡斯特里奥算法

✍ dations ◷ 2025-11-30 05:40:45 #算法,数值分析,样条

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

(该代码用到)

相关

  • 都市生态学都市生态学是应用自然生态学的理论分别理解人类社会的一种科学。芝加哥学派也常用都市生态学研究都市问题。其内容包括生态、组织、竞争、进化、入侵、均衡等自然定律。都市
  • 生长激素抑制激素· extracellular region · extracellular space· cell surface receptor linked signaling pathway · G-protein coupled receptor protein signaling pathway · ce
  • UsenetUsenet是一种分布式的互联网交流系统,源自通用用途的UUCP网络。1979年杜克大学的研究生汤姆·特拉斯科特(英语:Tom Truscott)与吉姆·埃利斯(英语:Jim Ellis)设计出来Usenet,并于198
  • 乌洛托品乌洛托品,也称作六亚甲基四胺,是一个与金刚烷结构类似的多环杂环化合物,分子式为C6H12N4。乌洛托品是白色的晶体,可由甲醛与氨反应制备,分子中含有四个相互稠合的三氮杂环己烷环
  • 江安世江安世(1958年-),台湾生物学家,中央研究院院士,现任职于国立清华大学,以果蝇神经解剖学相关研究著称。江安世毕业于国立中兴大学昆虫系,随后进入国立台湾大学植物病虫害系硕士班就读
  • 花莲县长花莲县县长为中华民国台湾省花莲县的最高行政首长,连选得连任一次 。现任县长为中国国民党党籍的徐榛蔚。本条目列出历任的花莲县县长。台湾省政府指派首任女性县长。
  • 普莱诺市布兰诺(Plano)是位于美国得克萨斯州科林县和登顿县的一座城市,人口约26万(2010年),居得克萨斯州第9位。布兰诺位于达拉斯-沃斯堡城市群,是世界上很多大公司的总部,如爱立信(北美), J
  • 哈勒尔贝克哈勒尔贝克(荷兰语:Harelbeke),比利时西佛兰德省部的一座城市,人口26,172(2006年)。
  • 王运丰王运丰(1914年-1997年4月29日),直隶(今河北)赞皇人,中华人民共和国武器专家、计算机专家,高级工程师,被誉为中华人民共和国“坦克之父”。他发出了中国第一封电子邮件“越过长城走向
  • 杨嗣修杨嗣修(1564年-1648年),字幼淑,号景欧,河南怀庆府河内县人。原籍山西洪洞县,七世祖杨九老始徙居河内。祖父杨来勤,生二子:杨棣、杨桐,同为庠生,杨嗣修即杨棣之子。万历二十二年甲午(1594