德卡斯特里奥算法

✍ dations ◷ 2025-12-01 07:55:10 #算法,数值分析,样条

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

(该代码用到)

相关

  • 志愿者志愿者(港澳称为义工,台湾称为志愿工作者),台湾简称志工,是指一种助人、具组织性及基于社会公益责任的参与行为,通常旨在促进善良或改善人类生活质量。其发展可追溯至二次大战后,福
  • 茱蒂·哈勒戴茱蒂·霍利德(英语:Judy Holliday,1921年6月21日-1965年6月7日),美国女演员,曾获奥斯卡最佳女主角奖与金球奖最佳音乐及喜剧类电影女主角。茱蒂·霍利德是家中独生女,出生时名为朱迪
  • 萨米族萨米人,是北欧地区的原住民,欧洲最大的原住民族群之一,也是欧洲目前仅存的游牧民族。萨米人的语言是萨米语,属于芬兰-乌戈尔语族。其他对于萨米人的称呼或写法有:Sámen、Saamen
  • 考德威尔县考德威尔县(英语:Caldwell County)是美国北卡罗莱纳州西北部的一个县。面积1,228平方公里。根据美国2000年人口普查,共有人口77,415人。县治勒诺 (Lenoir)。成立于1841年1月。县
  • 中直机关br /下属机构国务院部委管理的国家局,现在除国务院办公厅(正部级)管理的国家信访局、国务院直属机构国家市场监督管理总局(正部级)管理的国家知识产权局和国家药品监督管理局外,都是国务院组成
  • 王振铎王振铎(1911年-1992年),字天木,河北保定人。中国博物馆学家、中国古代科技史学家。现存的指南车、记里鼓车、候风地动仪、水运仪象台等实际上都是王振铎的复原模型。
  • 佩里 (佛罗里达州)佩里(英语:Perry),是美国佛罗里达州下属的一座城市。建立于1903年。面积约 为24.1平方公里(约合9.3平方英里)。根据2010年美国人口普查,该市有人口7,060人。论人口在本州排行第 184
  • 泮村泮村(반촌)是朝鲜王朝时泮民(반민,服务于成均馆儒生的奴婢)聚居的一个围绕汉阳成均馆的村庄。根据《礼记·王制》:“大学在郊,天子曰辟雍,诸侯曰泮宫”,朝鲜因为是明朝和清朝的藩属国
  • BLACK★ROCK SHOOTER动画角色列表此列表是《BLACK★ROCK SHOOTER》内的动画版登场人物的介绍,关于本系列其他作品请见条目BLACK★ROCK SHOOTER。相对于表世界存在的一个世界,但是只限于少女。表世界的关系和斗
  • IBM中国研究院IBM中国研究院(英语:IBM China Research Laboratory)是IBM在全球设立的12大研究机构之一。1995年成立于中国北京,2008年,IBM中国研究院上海分院成立。过去的20多年里IBM中国研究