德卡斯特里奥算法

✍ dations ◷ 2025-11-07 17:46:56 #算法,数值分析,样条

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

(该代码用到)

相关

  • 世界卫生组织基本药物清单世界卫生组织基本药物标准清单(法语:Listes modèles OMS des médicaments essentiels;英语:WHO Model List of Essential Medicines;简称EML)是世界卫生组织(WHO或称世卫组织)的出
  • 猫尾草猫尾草(学名:Phleum pratense)又叫梯牧草、提摩草、提摩西草(Timothy-grass),是一种多年生禾本科植物,原产于除地中海地区外的欧洲大部分地方。猫尾草生长高度约50至150厘米,叶可长
  • 张家口蒙疆联合自治政府(蒙古语:.mw-parser-output .font-mong{font-family:"Menk Hawang Tig","Menk Qagan Tig","Menk Garqag Tig","Menk Har_a Tig","Menk Scnin Tig","Oyun Gurb
  • 市县列表云南省县级行政区列表列出中华人民共和国云南省当前下辖的所有县级行政区。截止2018年8月,云南省辖有8地级市、8自治州、16县级市、17市辖区、67县和29自治县,共16个地级行政
  • 尼泊尔卢比尼泊尔卢比,符号RS;代码是NPR,是尼泊尔的货币单位,1卢比=100派萨。现时与印度卢比挂钩,币值为印度卢比的三分之二。
  • 蛲虫感染蛲虫感染(Pinworm infection),或称蛲虫病(enterobiasis),是一种因为蛲虫而导致的人类寄生虫疾病(英语:human parasitic disease)人类寄生虫病'。最常见的症状为肛门周围的强烈骚痒感,
  • 穆胡鲁穆胡鲁(Muhuru)是一种传闻出没于非洲肯尼亚的神秘生物,它通常被描述为一只四足巨型野兽,背上长着剑龙般的骨板,尾部则长着一个尾锤。目前已知第一例有记载的目击是传教士Cal Bomb
  • 玛撒拉玛撒拉(英语:masala;印地语:मसाला; 孟加拉语:মশলা; 乌尔都语:مصاله‎‎; 尼泊尔语:मसाला),或译为马萨拉、玛莎拉,是一种由多种香料混合起来的调味料。马萨拉其实是
  • 迈克尔·爱默生迈克尔·爱默生(英语:Michael Emerson,1954年9月7日-),美国演员,生于美国爱荷华州锡达拉皮兹市。1990年,迈克尔·爱默生出演了处女作电视电影《Orpheus Descending》,在剧中扮演了小
  • 阿方索二世 (阿斯图里亚斯)阿方索二世(西班牙语:Alfonso II,759年-842年3月20日),被称为纯洁的,从791年起为阿斯图里亚斯国王直到去世,他是弗鲁埃拉一世及巴斯克人姆妮亚(Munia)的儿子。759到760年间生于奥维耶