德卡斯特里奥算法

✍ dations ◷ 2025-07-02 11:37:00 #算法,数值分析,样条

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

(该代码用到)

相关

  • 尿道炎尿道炎(英语:urethritis)指尿道发炎,属于泌尿道感染之一种。最常见的症状是疼痛或排尿困难(dysuria)。在男性中,产生脓性分泌物通常表明淋菌性性质的尿道炎,同时明确的分泌物表示
  • 奥图·瓦伯格奥托·海因里希·瓦尔堡(德语:Otto Heinrich Warburg,1883年10月8日-1970年8月1日),德国生理学家和医生。1931年因“发现呼吸酶的性质及作用方式”被授予诺贝尔生理学或医学奖。在
  • 金虎尾目金虎尾目(学名:Malpighiales)又名黄褥花目,是真双子叶植物的一个大目,在以前的克朗奎斯特分类法中没有这一个目,金虎尾科是被分在远志目以下的。APG 分类法设立了这个目,在I类真蔷
  • 郭肇基郭肇基。山东金乡县人。清朝政治人物、进士出身。顺治二年,乡试中举;顺治三年,登进士。历任狄道县知县。
  • 尼迈里加法尔·穆罕默德·尼迈里(阿拉伯语:جعفر محمد النميري‎;1930年1月1日-2009年5月30日),苏丹政治人物,曾于1971年-1985年任苏丹总统。尼迈里1952年毕业于苏丹军事学
  • 奶油犬奶油犬(日语:バター犬)是指将奶油抹在身体性感带(例如乳头、阴部等),让犬只舔舐以获得快感,这些狗被用作是自慰的工具,属于人兽性行为的一种方式。另外,猫舌头因为有类似刷子般的倒刺
  • 比尔·欧文比尔·欧文(英语:William Mills "Bill" Irwin,1950年4月11日-)是美国的一位演员,小丑和喜剧演员。他曾经获得过托尼奖。欧文出演的电视剧有法律与秩序:特殊受害者和周一清晨。
  • 锺丁先钟丁先(1613年-1672年),字后觉、南山,号忏云,广东紫金县苏区镇永先村人。明末解元。崇祯十五年(1642年)广东乡试第一名举人(解元)。次年上京会试,至河南,被李自成所阻,只得返乡。桂王时任
  • 2011年中国网站用户信息泄露事件2011年中国网站用户信息泄露事件,是发生于2011年12月的多家中国互联网网站用户信息泄露的网络信息安全事件。2011年12月21日,互联网上传出开发者社区CSDN遭黑客攻击,600万用户
  • 阿尔伯特·爱因斯坦科学出版物列表阿尔伯特·爱因斯坦(1879年-1955年)是二十世纪著名理论物理学家,以狭义相对论和广义相对论的建立闻名于世。他在统计力学领域也做出了重要的贡献,特别是他对布朗运动的研究,解决了