德卡斯特里奥算法

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

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

(该代码用到)

相关

  • 圣希多尼乌斯·阿波黎纳里斯圣希多尼乌斯·阿波利纳里斯(英语:Sidonius Apollinaris),(430年-489年)。古罗马末期的诗人,外交家,主教。出生于今法国里昂,早年显贵,后进入仕途。西哥特人入侵时,他曾被囚禁,后被释放。
  • 角蛋白角蛋白是纤维结构蛋白家族之一。 它是构成头发,角,爪,蹄和人体皮肤外层的关键结构材料。 角蛋白也是保护上皮组织细胞免受损伤或压力的蛋白质。 角蛋白极不溶于水和有机溶剂。
  • 瓦伦蒂诺城堡瓦伦蒂诺城堡(Castello del Valentino)是意大利西北部城市都灵的一座历史建筑。它位于瓦伦蒂诺公园(Parco del Valentino),是都灵理工大学建筑系的所在地。1997年作为萨伏伊皇家
  • MoOsub2/sub二氧化钼是+4价钼的氧化物,化学式为MoO2。它是紫色的金属导体。它在自然界以罕见的秋格瑞诺夫矿(英语:tugarinovite)的形式存在。二氧化钼可以由下述方法制备:单晶可通过碘参与的
  • 商品农业精耕细作(英语:intensive farming),或简称精耕,指农业上采取各种手段,大量的人力、物力投入,以取得最大限度产出的耕作方式。东亚是世界上典型的精耕细作农业区,与北美粗放农业有所
  • 索比布尔集中营纳粹集中营转移营比利时:布伦东克堡垒 · 梅赫伦转移营法国:居尔集中营 · 德朗西集中营意大利:波尔查诺转移营荷兰:阿默斯福特集中营 · 韦斯特博克转移营挪威:法斯塔德集中营部
  • 澳门政党澳门社会中并无严格意义上的政党存在。所谓立法会参选组别只是临时性质,政治组织平时都以社团形式进行活动。
  • 水月洞天《水月洞天》是梁国冠和李达超共同执导的奇幻武侠剧,由于波、杨俊毅、蔡少芬、陈法蓉、张晋、卢星宇等主演,于2003年出品,2004年首播。该剧围绕三个家族五百年的恩怨,展开了一个
  • Alone (棉花糖歌曲)Alone是美国DJ和唱片制作人Marshmello发布的单曲。 歌曲在2016年5月首次发布, 并于6月17日开始提供数字下载。在发布后,歌曲登上了加拿大百强单曲榜第11位以及美国告示牌百强
  • A21高速公路 (意大利)A21高速公路(意大利语:Autostrada A21),又称葡萄酒高速公路(Autostrada dei Vini,因经过意大利葡萄酒产区得名),是意大利一条高速公路,自第四大城市都灵,沿波河南岸,经皮亚琴察,至布雷西