德卡斯特里奥算法

✍ dations ◷ 2024-09-20 15:07:46 #算法,数值分析,样条

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

(该代码用到)

相关

  • 禁酒运动禁酒运动是减少或禁止酒精饮料使用的社会运动。禁酒运动通常会主张禁酒、批评无节制的酒精使用,也会敦促政府颁布酒精法或禁酒令。在澳大利亚,禁酒运动始于1830年代中期,并不主
  • 查士丁尼瘟疫查士丁尼大瘟疫是公元541至542年发生在拜占庭帝国的一场大瘟疫。当时包括首都君士坦丁堡在内多地受到影响。关于是次瘟疫的具体疾病,最广为接受的说法是鼠疫。大瘟疫分为五次
  • 矩,又称动差,英文为moment。数学中矩的概念来自于物理学。在物理学中,矩是用来表示物体形状的物理量。矩是用于物体形状识别的重要参数指标。定义在实数域上的实函数相对于值c
  • 张作霖张作霖(1875年3月19日-1928年6月4日),字雨亭,小名张老疙瘩,奉天省海城县人,出身贫农。曾任中华民国陆海军大元帅,喜人以“张大帅”称。张作霖是北洋军奉系首领,也是北洋政府最后一个
  • 邻家特工《邻家特工》(英语:The Spy Next Door)是2010年初上映一部动作喜剧片,由布莱恩·莱温特执导,成龙、琥珀·瓦莱塔、比利·雷·赛勒斯领衔主演。在影片开始,播放了一段用蒙太奇的手
  • 西乌克兰人民共和国西乌克兰人民共和国(乌克兰语:Західно-Українська Народна Республика、乌克兰语:Zakhidno-Ukrayinska Narodna Respublyka或简称ЗУНР
  • 对称博弈在博弈论,如果博弈的收益只依赖于选手所选择的策略而不依赖于进行博弈的选手,这类博弈称为对称博弈。例如,在囚徒困境的博弈中,囚徒都选择认罪的结果为都判刑5年,都选择不认罪的
  • 莫斯科数学纸草书莫斯科数学纸草书,又名戈列尼谢夫数学纸草书是一件古埃及数学纸草书,由埃及以外首个持有者弗拉基米尔·戈列尼谢夫(英语:Vladimir Golenishchev)的名字命名,戈列尼谢夫于1892年或1
  • 黄轩 (清朝)黄轩(?-?),字曰驾,号小华。安徽休宁人。生卒年不详,其父黄兴仁于乾隆初年任湖南衡州知府,购得狮子林。黄轩少时好学,又工书法,乾隆三十六年(1771年)皇太后八旬寿辰特开恩科状元。授翰林院
  • 微软手机微软手机可以指: