德卡斯特里奥算法

✍ dations ◷ 2025-11-27 06:02:09 #算法,数值分析,样条

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

(该代码用到)

相关

  • 尼古拉·巴索夫诺贝尔物理学奖 (1964)罗蒙诺索夫金质奖章 (1989)尼古拉·根纳季耶维奇·巴索夫(俄语:Никола́й Генна́диевич Ба́сов,1922年12月14日-2001年7月1日),苏
  • 瑞舒伐他汀瑞舒伐他汀(英语:Rosuvastatin),商品名为Crestor,中文商品名在中国大陆为可定、在台湾为冠脂妥,是一种他汀类药物,与运动、饮食控制和减肥联合来治疗高胆固醇血症和其他相关症状,也
  • 猪传染性胃肠炎病毒猪传染性胃肠炎病毒(学名:Transmissible gastroenteritis virus、TGEV)是甲型冠状病毒属的一种病毒,与猫冠状病毒、犬冠状病毒同属甲型冠状病毒一型。此病毒可感染猪,造成猪传染
  • 液氦液氦(英语:Liquid helium)是指在极低温的摄氏温标-269 °C(约等于热力学温标4 K或者是华氏温标-452.2 °F)时成为液体的氦,该化学元素的沸点与临界点取自于氦的同位素:较为常见的氦
  • 2019中国好声音《中国好声音》是一档中国电视音乐选秀节目,2019年度节目从2019年7月19日至10月7日播出。本年度节目的四位导师为李荣浩、庾澄庆、那英和王力宏,主持人为华少(第一期至第八期、
  • 阿尔弗雷德·伊诺奇阿尔弗雷德·路易斯·伊诺奇(英语:Alfred Lewis Enoch,1988年12月2日-),是一位英国演员,因饰演《哈利波特》系列电影中的丁·汤马斯及电视系列剧《谋杀入门课》里的卫斯·吉宾斯而
  • 瑞麟瑞麟(满语:ᡯᡠᡳᠯᡳᠨ,穆麟德:,1809年-1874年),字澄泉,叶赫那拉氏,满洲正蓝旗人,清朝大臣。历任太常寺少卿、内阁学士、礼部侍郎、军机大臣、户部侍郎、礼部尚书、户部尚书、两广总督
  • 卡洛·佐科卡洛·佐科(意大利语:Carlo Zocchi;1894年-1965年), 是意大利著名画家, 活性 科莫湖, 的科莫湖最美丽的地方之一.
  • 傅振商傅振商(1573年-1640年),字君雨,河南汝宁府汝阳县(在今河南省汝南县、平舆县)县城西七十里坟塘人。明朝政治人物。傅振商于万历三十五年(1607年)中丁未科进士,选为翰林院庶吉士,改巡察御
  • 日本情报处理学会日本情报处理学会 (英语:Information Processing Society of Japan) 是一个情报收集,处理的计算机科学学会。1960年4月22日创建于东京都,是国际信息处理联合会正式成员。 2017