德卡斯特里奥算法

✍ dations ◷ 2025-12-09 07:50:24 #算法,数值分析,样条

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

(该代码用到)

相关

  • 国歌《自由颂》(希腊语:Ύμνος εις την Ελευθερίαν,拉丁字母转写:Ímnos is tin Eleftherían)本来是一首有158节的诗,迪奥尼西欧斯·所洛莫斯在1823年著成,尼古劳
  • EcoRVEcoRV(V是5的意思)是一种第二型限制内切酶,来自某些特定品系的大肠杆菌(Escherichia coli),此细菌的学名也是EcoRV前三个字母的由来。EcoRV是分子生物学与生物技术上常使用的限制
  • 酵母菌感染念珠菌症(Candidiasis)是假丝酵母属(酵母菌的一种)所造成的霉菌感染,在感染口腔时,就会引发鹅口疮(Thrush)。症状和病征包括在舌头、口腔以及咽喉的部位出现小白点,也可能产生例如酸
  • 贝纳迪诺加州州立大学圣贝纳迪诺分校(California State University, San Bernardino,亦称:Cal State San Bernardino or CSUSB)是加利福尼亚州立大学系统内、位于美国加利福尼亚州圣贝纳
  • 南岳衡山衡山,五岳之一,也称为“南岳”,南岳始封于唐虞,是古代中国帝王巡狩祭祀的地方,也是道教和汉传佛教的圣地之一。主景区全称“衡山风景名胜区”位于衡山县境内,现已划为南岳区,为衡阳
  • 鞍之战鞌之战又名鞍之战,是中国历史上春秋时期齐国和晋国之间发生于前589年六月十七的一场战斗。作战的地点是鞌(今济南西北)。前589年,齐顷公率齐军讨伐鲁国及卫国,鲁国及卫国派使者至
  • 苏丹公民签证要求部分国家给予苏丹护照持有者豁免签证或落地签证待遇, 苏丹公民如欲入境这些国家,无需提前申请签证。安提瓜和巴布达 · 阿根廷 · 阿鲁巴 · 巴哈马 · 巴巴多斯 · 伯
  • 4-氯苯甲酸4-氯苯甲酸是一种有机化合物,化学式为ClC6H4CO2H。它是白色固体,可溶于一些有机溶剂和碱的水溶液中。它可由4-氯甲苯的氧化反应制得。高锰酸钾氧化法会先得到4-氯苯甲酸钾,滤出
  • 吴庆隆吴庆龙,是一位著名的新加坡编曲家、演唱会音乐总监,擅长以优美的钢琴旋律、大气的弦乐编曲。与众华语天王天后有多次合作,多次合作过的著名歌手包括张学友、孙燕姿、王力宏、陶
  • 树 (数据结构)在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集