德卡斯特里奥算法

✍ dations ◷ 2025-10-24 07:21:59 #算法,数值分析,样条

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

(该代码用到)

相关

  • 物理学原子核物理学(简称核物理学,核物理或核子物理)是研究原子核成分和相互作用的物理学领域。它主要有三大领域:研究各类亚原子粒子与它们之间的关系、分类与分析原子核的结构并带动
  • 唐家乡唐家乡可以指:
  • 野生动物野生动物泛指各种生活在自然状态下,未经人类驯化的动物。自然界里,野生动物会用排泄物来标识其领土,宣示主权的习惯。野生动物,故名思意,为野外生长繁殖的动物,一般而言,具有以下特
  • 劳动部劳动及职业安全卫生研究所劳动部劳动及职业安全卫生研究所(简称劳安所)为中华民国劳动部的所属机构;是台湾唯一研究劳动政策和职业安全卫生的政府机关。可乘坐 板南线捷运,达终点站南港展览馆站(6号出口)
  • 灯塔水母灯塔水母(学名:Turritopsis nutricula)属于水螅纲,是水母的一种。其特征是性成熟(能够进行有性生殖)个体的生命周期能从水母型直接重返水螅型(英语:Polyp_(zoology)),而跳过死亡的过程
  • 日本传统艺能日本传统艺能是日本自古代流传下来艺术技能的泛称。自特定阶级的教养、娱乐、仪式、祭嗣等活动的特定形式而来,经系统化的传承而尚未消失的有形、无形之物,如诗歌、音乐、舞蹈
  • 富拉语富拉语(Fulfulde, Pulaar, Pular)是西非语言,主要是从塞内冈比亚(Senegambia)、畿内亚至喀麦隆、苏丹一带的富拉人使用,属于尼日尔-刚果语系的大西洋-刚果语族分支。现时富拉语多
  • 加泰罗尼亚公国加泰罗尼亚公国(加泰罗尼亚亲王国,加泰罗尼亚语:Principat de Catalunya)是位在加泰罗尼亚的公国,在巴塞罗那伯爵的支配之下。
  • 马岛隼马岛隼()是细小的猛禽。其学名是为纪念英国鸟类学家爱德华·纽顿(Edward Newton)。马岛隼有两个亚种,分别在马达加斯加及阿尔达布拉群岛。它们的最近亲是塞舌尔隼,曾一度被认为是
  • 双凫铺镇双凫铺镇是中国湖南省宁乡市下辖镇。地理上位于宁乡市正中部。地缘上,双凫铺镇北与喻家坳乡接壤,东与大成桥镇、资福乡毗邻,南接灰汤镇,西连老粮仓镇与横市镇。辖域面积89.5平方