德卡斯特里奥算法

✍ dations ◷ 2025-11-24 14:39:16 #算法,数值分析,样条

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

(该代码用到)

相关

  • 巴西巴西外交由巴西对外关系部(Ministério das Relações Exteriores)负责掌理,巴西在拉丁美洲的政治与经济上占有举足轻重的地位,也是世界政经关系的要角。巴西的外交政策反映其
  • 昭和天皇之死除特别注明外,本文所有时间均以东九区时间(UTC+9)为准。日本第124代天皇裕仁于昭和64年(1989年)1月7日6时33分(日本时间)因十二指肠癌在东京皇居吹上御所驾崩,享寿88岁(满87岁),其死讯
  • World世界一词在现代社会意为对所有事物的代称。原本是佛教概念,由“世”(时间)和“界”(空间)组合而成的世界(梵语:lokadhātu),即所谓由所有时间空间组成的万事万物。“世界”在现代是人
  • 麦门冬山麦冬属是天门冬科假叶树亚科中的一个属,它产于东亚,其植物类似草,开花。今天在温带一些种经常被用作园林植物。山麦冬属曾经被划为百合科,在被子植物APG II分类法 (修订版)中
  • 虞华年虞华年(1929年1月17日-),台湾高科技电子工业要人。曾任台湾工业技术研究院(简称“工研院”)前瞻研发指导委员会主席、荣誉主席。浙江慈溪人。籍贯浙江省慈溪县(今慈溪市),1929年生于
  • 斯特弗·库根史蒂夫·库根(Stephen John "Steve" Coogan,,1965年10月14日-)是英国的一位演员、喜剧演员、作家和制作人。他的演艺生涯开始于1980年代 。
  • 大和煮大和煮(日语:やまとに )是一种将肉类加酱油、砂糖、生姜等调味料炖煮而成的日式料理,一般以罐头的形式面市。大和煮主要以牛肉为原料,但也适合料理鲸肉等异味较重的肉类。自明治
  • 东升水库东升水库,位于中华人民共和国黑龙江省林甸县西北部,是乌裕尔河内流区的一座大型平原水库。水库始建于1958年,最初工程建设过程中存在很多缺陷,之后进行过多次续建加固。水库主要
  • 伊瓦采维奇伊瓦采维奇(白俄罗斯语:Івацэвічы,俄语:Ивацевичи,波兰语:Iwacewicze,立陶宛语:Ivasevičai,英语:Ivatsevichy)是白俄罗斯的城市,位于该国首府布列斯特东北131公里,距
  • 天津人民出版社天津人民出版社是由知识书店(1950年重组)、天津通俗出版社(1952年组建)发展而来的。1956年,天津通俗出版社正式更名为天津人民出版社。《八小时以外》和《汽车生活》现有职工九十