德卡斯特里奥算法

✍ dations ◷ 2025-12-04 08:02: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

(该代码用到)

相关

  • 机械能机械能(英语:Mechanical energy)又作力學能,是指宏观物质所表现出的势能(位能)Ep与动能Ek的总和,即机械能守恒定律(英语:law of conservation of mechanical energy)是动力学中的基本
  • 白三烯A4白三烯A4(英语:Leukotriene A4)是一种白三烯。白三烯A4水解酶可将其水解为白三烯B4,白三烯C4合酶可将其与谷胱甘肽结合生成白三烯C4。医学导航:遗传代谢缺陷代谢、k,c/g/r/p/y/i,
  • 黑霉菌小煤炱目(学名:Meliolales)是一类专性寄生菌,属于子囊菌门粪壳菌纲。该目下有一单科小煤炱科(Meliolaceae)。主要在热带地区出现,小煤炱菌会在寄主植物的表面形成黑色菌落,故又被称
  • 阿含经最初僧伽 ├ 大众部  ├ 一说部  ├ 说出世部  ├ 灰山住部  ├ 多闻部  ├ 说假部  └ 制多部 └ 上座部  ├ 雪山部  ├ 说一切有部   ├ 说转部   └ 经
  • 燕罗街道燕罗街道是中华人民共和国广东省深圳市宝安区下辖的一个街道办事处,名称取自辖区内的旧水塘——“燕罗塘”。辖区总面积27.15平方公里,下辖山门、洪桥头、燕川、罗田、塘下涌
  • 德城区德城区是中国山东省德州市所辖的一个市辖区,为德州市市政府所在地,因位于德州市城区而得名。德城区位于山东省西北边界,总面积为539平方公里,2001年人口为54万。在德州地区,口头
  • M-LOKM-LOK(“模块化锁定”Modular Lock的简写)是美国马格普工业公司研发并注册专利的一款免费许可的“负空间”(凹洞式)枪械导轨界面系统,用来部分取代现今被广泛使用的皮卡汀尼导轨,
  • M2M (组合)窈窕美眉(英语:M2M)是由来自挪威的玛丽特·拉森(中文译为:乖乖美眉、玛丽美眉、玛莉特)及玛丽安·雷文(中文译为:好动美眉、落比美眉、玛莉安)组成的双人女子团体。因两人名字开头均
  • 双黄头亚马逊鹦鹉双黄头亚马逊鹦鹉(),又名黄头亚马逊鹦鹉或黄冠亚马逊鹦哥,是墨西哥及中美洲北部一种濒危的鹦鹉。它们长35-38厘米,主要呈绿色,尾巴短小,头部黄色。它们栖息在红树林或近河流的森林
  • 山榄科参见正文山榄科(学名:),包括约65属800余种,主要分布在世界各地的热带地区。中国有11属约30种,主要分布在南方各地。本科植物都是常绿灌木和乔木,有许多品种的木材有价值,也有可以初