德卡斯特里奥算法

✍ dations ◷ 2025-08-13 03:08:34 #算法,数值分析,样条

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

(该代码用到)

相关

  • 输尿管囊肿输尿管囊肿(Ureterocele)在输尿管中所发现的"输尿管先天畸形"病症。此种病症称为输尿管囊肿症(ureteroceles),输尿管气球产生在膀胱开口处,并形成一个"囊袋"(sac-like pouch)
  • 巴库巴库(阿塞拜疆语:Bakı;IPA: .mw-parser-output .IPA{font-family:"Charis SIL","Doulos SIL","Linux Libertine","Segoe UI","Lucida Sans Unicode","Code2000","Gentium","G
  • 北海北海(挪威语:Nordsjøen;瑞典语:Nordsjön;丹麦语:Nordsøen或Vesterhavet;德语:Nordsee;荷兰语:Noordzee;法语:Mer du Nord;英语:North Sea)是北大西洋的一部分,位于大不列颠岛以东,斯堪的纳
  • 森林破坏森林砍伐,或称森林开伐、去森林化(Deforestation)、森林破坏,意为人为的将森林地转成耕地、牧场、城市等用地的行为。一般来说,森林开伐会造成环境退化和物种多样性的减少。许多
  • 美国残疾人法案美国残疾人法案(英语:Americans with Disabilities Act of 1990)是由美国国会在1990年7月通过的一项法案,经由老布什总统签署生效。2008年小布什总统又签署了残疾人法案修正案,这
  • 阿尔弗雷德·冯·瓦德西阿尔弗雷德·海因里希·卡尔·路德维希·冯·瓦德西(德语:Alfred Heinrich Karl Ludwig Graf von Waldersee,1832年-1904年),伯爵,德国元帅(英语:Generalfeldmarschall)。阿尔弗雷德·
  • 绫濑遥绫濑遥(日语:綾瀬 はるか,1985年3月24日-),为日本广岛县出身的女演员和女歌手。帝京大学短期大学国际沟通学科中途退学,现隶属Horipro事务所。身高165cm,血型B型。
  • 布雷默布雷默(英语:Braymer)是一个美国城市,位于密苏里州考德威尔县。根据2010年的人口普查,当地人口为878人。根据美国人口普查局,该城市的总面积为0.59平方英里(1.53平方千米)。根据2010
  • 欧盟排放交易体系欧盟排放交易体系(European Union Emission Trading Scheme,EU ETS),是世界上第一个多国参与的排放交易体系。是欧盟为了实现《京都议定书》确立的二氧化碳减少排放的目标,而于
  • 光致变色光致变色是指通过吸收电磁辐射使化学物质在两种形式之间进行可逆的转化,且两种形式具有不同的吸收光谱。 通常,这可以描述为暴露于光线时颜色的可逆变化。 光致变色不具有