德卡斯特里奥算法

✍ dations ◷ 2025-09-18 03:55:01 #算法,数值分析,样条

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

(该代码用到)

相关

  • 伏打电堆伏打电堆(Voltaic pile),又名伏打堆,是最早出现的化学电池,是在1800年由意大利物理学家亚历山大·伏打伯爵发明。伏打电堆由很多个单元堆积而成,每一单元有锌板与铜板各一,其中夹着
  • 炸药爆炸物是在一定的外界能量的作用下,由自身能量发生爆炸的物质。一般情况下,炸药的化学及物理性质稳定,但不论环境是否密封,药量多少,甚至在外界零供氧的情况下,只要有较强的能量(包
  • 遗传印记基因铭印(英语:Genomic imprinting)又译遗传印记或遗传铭印(genetic imprinting)是一种遗传学现象,指只有来自特定亲代的基因得以表达,而不遵从孟德尔定律依靠单亲传递某些遗传学性
  • 西部走廊台湾西部,或称西台湾、台湾西部走廊,是指台湾西半边的地理区域,包括北台湾(不含宜兰县)、中台湾与南台湾的非山地地带,濒临台湾海峡,与中国大陆及金马地区隔海相望,占台湾本岛总面积
  • 溴虫腈溴虫腈(Chlorfenapyr),中国大陆通称“虫螨腈”,是一种用于杀虫、杀螨、杀线虫的农药。因其低毒高效,是无公害农产品病虫防治推荐用农药。溴虫腈是一种前体杀虫剂,本身对昆虫无直接
  • 巧克力披萨巧克力披萨是披萨的一种类型。使用巧克力作为披萨的主要成分。巧克力饼可以作为一种甜点。甚至有一些公司在制作巧克力披萨有各自专门的技巧。在美国,有一家名为“巧克力披萨
  • 瓦西里·米哈伊洛维奇·戈洛夫宁瓦西里·米哈伊洛维奇·戈洛夫宁(俄语:Василий Михайлович Головнин,1776年-1831年),俄罗斯探险家、海军中将。1807年至1809年,以舰长身份率领俄国军舰Di
  • 黄元御黄元御(1705年-1758年),名玉璐,字元御,一字坤载,号研农,别号玉楸子。山东昌邑人。清代医学家。
  • 台湾油矿陈列馆台湾油矿陈列馆(英语:Taiwan Oil Field Exhibition Hall),位于苗栗县公馆乡开矿村后龙溪岸出磺坑矿场,隶属台湾中油公司探采事业部,为台湾最早发现石油的地点,是亚洲的第一口兼全世
  • M(A)DE IN JAPAN (滨崎步专辑)《M(A)DE IN JAPAN》是日本歌手滨崎步的第17张原创专辑,于2016年6月29日在日本发行,也是滨崎步第一张未能卖出5万销量的原创专辑。本作是继前作《sixxxxxx》时隔近11个月,滨崎