德卡斯特里奥算法

✍ dations ◷ 2025-09-10 05:36:21 #算法,数值分析,样条

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

(该代码用到)

相关

  • 辣炒年糕辣炒年糕(韩语:떡볶이),又叫韩式炒年糕,是一道很受欢迎的韩国小吃,一般能在当地的路边摊或布帐马车处买到。这道菜的雏形是炖朝鲜打糕(떡찜),是用年糕片、肉、蛋和调味料做成的一道炖
  • 宇宙学常数宇宙学常数(cosmological constant)或宇宙常数由阿尔伯特·爱因斯坦首先提出,现前常标为希腊文“Λ”,与度规张量相乘后成为宇宙常数项 Λ
  • 冥界 (古埃及)冥界(音译“杜阿特”,英语:Duat,也作Tuat、Tuaut、Akert、Amenthes、Amenti或Neter-khertet)是埃及神话中的死后世界。它在象形文字中表示为“
  • 两轮两轮选举制(Two-round system)又称“两轮投票制”、“两轮决选制”(Run-off election),指选举无法一次选出结果时,采用两轮投票的选举制度。如果某选举中没有任何一个人过半数的选
  • 流通货币通货,是指在社会经济活动中作为流通手段的货币。货币的一个作为交换媒介形式的部分,通货是各国货币供应量中无需背书的部分,只包括纸币、硬币,不包括货币的存储功能以及其他支付
  • 委内瑞拉玻利瓦尔US$1 = Bs.S. 2.4883 (公告价格)(看黑市价格) US$1 = Bs.S. 60 (石油币汇率)委内瑞拉主权玻利瓦尔(西班牙语:bolívares soberanos;货币符号:Bs.S.;ISO 4217代码:VES)是委内瑞拉自
  • 文化挪用文化挪用(英语:Cultural Appropriation),是指较强势的个体或文化群体对于相对弱势的个体或文化群体时,在不理解、误解、恶意或有害的诠释弱势文化;或取笑、歧视、不尊重弱势文化;或
  • 贝切定律贝切定律(英文;Birch's law),是美国地球物理学家弗朗西斯·贝切(英语:Francis Birch (geophysicist))于1961年建立的,指出在平均原子量为 M
  • 高鹏振高鹏振(1898年8月10日-1937年6月23日)又名高青山,字云翔,号竞雄,化名苏云祥、高德山,是出生于中国辽宁省黑山县的民国时期东北抗日义勇军将领和烈士。他早年是地方防匪民团首领,后因
  • Swiber控股Swiber控股有限公司,简称Swiber控股(英语:Swiber Holdings Limited,SGX:AK3),在1996年由吴金德先生(主席)创立,现时总裁为Francis Wong Chin Sing。现时在环球承包综合岸外工程、采购