德卡斯特里奥算法

✍ dations ◷ 2025-11-25 15:33:27 #算法,数值分析,样条

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

(该代码用到)

相关

  • 毒性休克症候群毒性休克症候群(Toxic shock syndrome,TSS)是一种因细菌外毒素引起的症候群。相关症状包含发烧、红疹、皮肤脱落(英语:skin peeling),及低血压等等。其它与特定病原菌相关的症状包
  • 片假名(日语:片仮名/かたかな/カタカナ katakana *),是日语中表音符号(音节文字)的一种。与平假名、万叶假名等合称作假名。“片假名”一词在使用时常用“カタカナ”表示。签名时
  • 波斯语波斯语(فارسی / Fârsî‎),中文也称波斯文,属于印欧语系印度-伊朗语族伊朗语支,是一种形成于8至9世纪间的文学语言。是今天伊朗的官方语言,作为其分支的达利语和塔吉克语
  • 工匠手工艺人(英语:Artisan,或称为匠人、匠师)是指拥有某项熟练技巧,从事传统手工艺的工作者。古时的手工艺是以师徒制度传承,学徒跟随匠师担任助手,在日常工作中学习手工的技术和知识;
  • 灯心草属225-300种灯心草属(学名:Juncus)是灯心草科多年生草本植物,多生于淡水湿地边,主要产于江苏、四川、云南、贵州。灯心草属植物的茎心空如棉条,可吸水或油,故用作油灯的灯心。灯心草属
  • 日立日立可以指:
  • 静坐罢工静坐罢工是一种劳工罢工,有组织的劳工团体表现公民不服从的方式之一。这类行动通常于工人受雇的工厂或其他集体工作地点进行,方式为未经授权甚至非法地在工作场所静坐(英语:Occu
  • 约化质量在牛顿力学里,约化质量(Reduced mass),也称作折合质量、减缩质量,是出现于二体问题的 “有效”惯性质量。这是一个量纲为质量的物理量,使二体问题能够被变换为一体问题。假设有两
  • 王献唐王献唐(1896年-1960年),男,幼名家驹,本名琯,表字献唐,别号风笙、又号向湖。山东省日照市东港区人,中国德文教师、经学、金石学学者。1896年10月24日(清光绪二十二年九月十八日)生。父王
  • 野菰野菰(学名:),又称蔗寄生、大芸、金锁匙、茶匙黄、土地公拐、芋草菰、番仔烟斗、灌草菰、铁雨伞。广泛分布于热带及亚热带地区,台湾分布于低海拔山区和平野。列当科野菰属的野菰为