德卡斯特里奥算法

✍ dations ◷ 2025-04-17 06:06:50 #算法,数值分析,样条

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

(该代码用到)

相关

  • 骨骼肌骨骼肌是一种肌组织。此外心肌和平滑肌亦属于肌组织。肌肉中的肌细胞又称肌纤维,而骨骼肌的肌细胞属于多核细胞,有几十个甚至上百个呈扁椭圆形的细胞核。骨骼肌纤维呈长圆柱状
  • 阿罗哈客运阿罗哈客运股份有限公司(英语:Aloha Bus Company, Ltd.),简称阿罗哈客运,前身为世昌通运,现时这家客运公司为高雄市的国道客运公司,现时有三条国道客运路线,分别为3888台北-嘉义,3999
  • 沙质荒漠沙漠,亦作砂漠,全称沙质荒漠(英语:Erg),是地球干燥气候影响下所产生的地貌,约占地球陆地整体面积的21%。沙漠地区一般年平均降雨量低于250毫米,被沙质土壤所覆盖,植被稀疏。它因地表
  • 需求曲线需求曲线是显示在特定时间内,某物品的价格与需求量关系的曲线,反映了需求表两个向量的线性关系。需求曲线是需求表和需求函数的图像化表达,并且和供给表或供给函数交接组成均衡
  • 1661台湾船园区1661台湾船园区,为台南市安平港的户外博物馆,占地约1,800坪,2019年开馆,主要展示仿古帆船“台湾成功号”,并结合公共艺术推广海洋文化。台湾成功号,为台湾第一艘仿古木造帆船,原型
  • 史都华镇 (宾夕法尼亚州)史都华镇是位于美国宾夕法尼亚州费耶特县的一个镇。在2000年的人口普查,该镇有 743 位居民。根据美国人口调查局的调查,史都华镇总面积 132.4 平方公里。其中 131.2 平方公里
  • 周边元件互连特别兴趣小组周边元件互连特别兴趣小组(英语:Peripheral Component Interconnect Special Interest Group,缩写:PCI-SIG),是一个负责订定PCI、PCI-X和PCI Express电脑总线规格的电子工业联盟。
  • 马里奥·卡斯泰尔诺沃-泰代斯科马里奥·卡斯泰尔诺沃·泰代斯科(意大利语:Mario Castelnuovo-Tedesco,1895年4月3日-1968年3月16日),犹太血统的美籍意大利作曲家。卡斯泰尔诺沃·泰代斯科出生于一个富裕家庭,早年
  • 井上胜井上胜(日语:井上 勝/いのうえ まさる ,1843年8月25日-1910年8月2日),日本近代化先驱,被称为日本的“铁路之父”。任上强烈支持铁路国有化。日本幕末时期生于长州藩萩城(位于今山口
  • 埃登巴赫大街站埃登巴赫大街站(德语:U-Bahnhof Aidenbachstraße)是慕尼黑地铁3号线位于慕尼黑塔尔基兴-上森德灵-福斯滕里德-菲尔斯滕里德-索恩的一座车站。 维基共享资源中与埃登巴赫大街站