德卡斯特里奥算法

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

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

(该代码用到)

相关

  • 生物物理生物物理学(英语:Biophysics)是生物学和物理学的交叉学科,研究生物的物理特性。生物物理涵盖各级生物组织,从分子尺度到整个生物体和生态系统。它的研究范围有时会与生理学、生物
  • 李必氏冷凝管利氏冷凝管(德语:Liebigkühler,又译为李必氏冷凝器、直型冷凝管),是一种在实验室中常见到的器材,在很早以前即被发明,不过由19世纪时的德国化学家尤斯图斯·冯·李比希(Justus von
  • 微丝骨架细胞骨架(英语:Cytoskeleton)一般是指细胞内细胞质中的由蛋白质构成的纤维的网络结构。它是一个动态结构,其中有一部分是不断的被破坏,更新或新建的。在生命的所有生物领域(古菌,细
  • 五阶五边形镶嵌在几何学中,五阶五边形镶嵌是由五边形组成的双曲面正镶嵌图,在施莱夫利符号中用{5,5}表示。五阶五边形镶嵌即每个顶点皆为五个五边形的公共顶点,顶点周围包含了五个不重叠的五
  • 眼直肌使眼球垂直或水平运动的肌肉每个眼球有六块外肌(四块直肌和两块斜肌)来控制活动。外直肌、内直肌、下直肌和上直肌使眼球上下或左右转动,相互呈直角排列。〈人体学习百科〉
  • 埃内斯托·梅希亚 埃内斯托·梅希亚(英语:Ernesto Mejía,1985年11月2日-),为委内瑞拉的棒球选手之一,于2002年美国职棒选秀亚特兰大勇士自由契约球员,目前效力于日本职棒埼玉西武狮,守备位置为内野
  • 双酚F双酚F(英语:Bisphenol F,缩写BPF,系统名4,4’-二羟基二苯甲烷,4,4’-dihydroxydiphenylmethane)是一种芳香型有机化合物,化学式(HOC6H4)2CH2,和双酚A结构类似,同属于双酚系列,但少了两
  • 黄宗道黄宗道(1921年2月3日-2002年11月22日),原籍湖北孝感,出生于湖北武汉,中国天然橡胶及热作专家。1945年毕业于金陵大学农学院。1997年当选为中国工程院院士。
  • 次后元音表内成对的元音分别为不圆唇/圆唇。次后元音(near-back vowel)是一种存在于部分语言中的元音。它的特点是舌头的位置稍向后缩,介于央元音和后元音之间。目前被国际音标承认的次
  • 星斑裸颊鲷星斑裸颊鲷(学名:),又称青嘴龙占,俗名龙尖,为辐鳍鱼纲鲈形目龙占鱼科的其中一个种。本鱼分布于印度西太平洋区,包括红海、东非、马达加斯加、毛里求斯、留尼汪、马尔代夫、塞舌尔群