德卡斯特里奥算法

✍ dations ◷ 2025-06-08 16:41:02 #算法,数值分析,样条

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

(该代码用到)

相关

  • 鼻窦鼻窦(Paranasal sinuses),又名鼻旁窦,位于人的头颅,在头骨之间、鼻腔周围的颅骨与脸骨之内。鼻窦共有四对,平时充满了空气(英语:skeletal pneumaticity),在鼻腔附近。上颌窦(英语:maxill
  • 慢性肾脏病慢性肾脏病(又称慢性肾功能不全或慢性肾衰竭、Chronic kidney disease(CKD)、chronic renal disease(CRD)),指肾功能在几个月或若干年期间逐渐而难以逆转的衰退。据估计,慢性肾病患
  • 膀胱癌膀胱癌 泛指各种出自膀胱的恶性肿瘤,也就是有异常细胞大量增殖而不受管制。膀胱是贮存尿液的中空器官,外壁主要由肌肉构成,位于下腹部。最常见的膀胱癌细胞来自膀胱内面黏膜表
  • Echinoderm棘皮动物门(学名:Echinodermata)是动物界的一门。这个门从寒武纪出现,总共有2万左右的种类,现生种约7000种。除现生5纲外,另有15纲之多,皆为海生动物,无陆生和淡水种类。常见的海胆
  • 小暑数据来源:喷气推进实验室线上历书系统小暑,是中国传统历法中二十四节气之一,在每年的7月6日-7月8日之间。此时太阳位于黄经105°。小暑小禾黄小暑吃芒果小暑温暾大暑热小暑过,一
  • 桐庐县桐庐县是杭州市的下辖县,位于中国浙江省西北部、富春江沿岸,和下游的富阳区一起是元代画家黄公望的传世名作《富春山居图》的实景地。2015年7月,中国城市竞争力研究会发布《201
  • 邰丽华邰丽华(1976年11月-),湖北宜昌人,中国残疾人艺术团团员,同时兼任演员队队长、团长助理以及中国特殊艺术协会副主席。她曾参与多场大型舞蹈表演,获奖无数,在2005年中央电视台春节联欢
  • 南庚南庚(?-?),子姓,名更,中国商朝第十八任君主。沃甲之子,前任君主祖丁之从弟(堂弟)。南庚在位期间将国都由庇迁至奄,因奄地偏南,所以此王得名“南庚”。死后由祖丁之子阳甲继位。现今流传
  • 同种型 (免疫学)是指免疫球蛋白类型或亚型的重链遗传变化或差异。人类有九种同种型:免疫球蛋白类型转换可以改变重链的类型,但不会改变轻链。表位(线性、构象)抗体(单株抗体、多株抗体、自身抗体
  • 张苇航张苇航(1986年5月25日-),台湾桃园人,是网络游戏实况主,为蹦蛙数位娱乐旗下员工,绰号“国动”,源自于他喜欢看的政论节目《大话新闻》中的常态来宾吴国栋。除此之外,也有“疯狗动”、