德卡斯特里奥算法

✍ dations ◷ 2025-11-26 04:17:58 #算法,数值分析,样条

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

(该代码用到)

相关

  • 后汉书《后汉书》是记载东汉历史的纪传体史书,由南朝刘宋时的范晔(398年-445年)所著。本书分十纪、八十列传和八志(八志自司马彪《续汉书》补入),记载了从光武帝称帝(25年)起至汉献帝禅让(22
  • 比利牛斯山脉比利牛斯山,位于欧洲西南部,山脉东起于地中海,西止于大西洋,分隔欧洲大陆与伊比利亚半岛,也是法国与西班牙的天然国界,山中有小国安道尔。长435公里,宽80-140公里,一般海拔在2000米以
  • 核苷三磷酸核苷三磷酸(英语:Nucleoside triphosphate;NTP)是在生物化学与分子生物学中含有与三个磷酸基团结合的核苷的分子。因此它是一种类型的核苷酸。核苷三磷酸是生命必需的,因为它们提
  • 双胞胎双胞胎(英语:twins),又称孪生、孪生儿、孪生子、孖生、双生,双生儿。指胎生动物一次怀胎里同时生下两个个体的情况。人类生育的通常情况,女性每一次月经周期,卵巢只会释放一粒卵子,
  • 白克兰电流白克兰电流是沿着联结地球磁层的磁场线流进地球高纬度电离层的一股电流。在地球的磁层,这股电流由太阳风和行星际磁场以及体积庞大的等离子体驱动着(由行星际磁场间接的驱动着
  • 山东宗教山东省现在主要有佛教、道教、伊斯兰教、天主教和基督新教五种宗教。佛教和道教在山东有千年以上历史,伊斯兰教主要自13世纪随回族穆斯林徙居山东后发展的。天主教和基督教主
  • 浊齿龈边擦音浊齿龈边擦音(voiced alveolar lateral fricative、voiced dental and alveolar lateral fricatives)是辅音的一种,在国际音标中表示该音的符号是⟨ɮ⟩,X-SAMPA符号则是⟨K\⟩
  • 杰克·所罗门杰克·所罗门(英语:Jack Solomon)为一位美国音讯工程师。他曾赢得了1次奥斯卡最佳音响效果奖,并在这个奖项上获得了5次提名。自1953年至1991年间他参与了90多部电影的制作。所罗
  • 李·巴纳特李·巴纳特(英语:Lee Barnard;1984年7月18日-)是一位英格兰足球运动员,在场上的位置是前锋。他现在效力于英格兰足球乙级联赛球队绍森德足球俱乐部。
  • 山姆·奇德斯山姆·奇德斯(英语:Sam Childers,1963年-),美国人,生于北达科他州,知名慈善家、基督教传教士。早年混迹摩托车帮会,其后投入毕生精力与财产资源,致力解救南苏丹内战中的受害孩童。奇德