fbpx
维基百科

德卡斯特里奥算法

数学子领域数值分析中的德卡斯特里奥算法(英語:De Casteljau's algorithm),以发明者保尔·德·卡斯特里奥命名,是计算伯恩斯坦形式的多项式或貝茲曲線递归方法。

虽然对于大部分的体系结构,该算法和直接方法相比较慢,但它在数值上更为稳定

定义

贝兹曲线B(角度为n,控制点 )可用以下方式运用德卡斯特里奥算法

 ,

其中b伯恩施坦基本多项式英语Bernstein polynomial

 .

曲线在t0点上可以用遞迴關係式运算

 
 

然后,  点上的计算可以此算法的 步计算。 的结果为:

 

再者,贝兹曲线 可在 分成带有各种控制点的两段曲线:

 
 

注意事项

进行手算时把系数写成三角形形式很有用。

 

当选择一点t0来计算波恩斯坦多项式时,我们可以用三角形形式的两个对角线来构造多项式的分段表示。

 

把它变成

 

以及

 

例子

我们要计算2次波恩斯坦多项式,其伯恩斯坦系数为

 
 
 

t0点计算。

我们有下式开始递归

 
 

递归的第二次重复结束于

 

这就是我们所预料的n阶伯恩斯坦多项式。

贝塞尔曲線

在计算带n+1个控制点Pi的三维空间中的n贝塞尔曲線 (Bézier curve) 时

 

其中

 .

我们把Bézier曲线分成三个分立的方程

 
 
 

然后我们用de Casteljau算法分别计算。

伪代码例子

这是一个递归的画出一条从点P1P4,弯向P2P3的曲线的伪代码例子。级数参数是递归的次数。该过程用增加了的级数参数来递归的调用它自己。当级别达到最大级别这个全局变量时,在P1P4之间就画上直线。函数中点(midpoint)去两个点,并返回这两点间的线段的中点。

 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<-[0..1] 返回:代表点(1-tP + tQ的表 > linearInterp :: [Float]->[Float]->Float->[Float] > linearInterp [] [] _ = [] > linearInterp (p:ps) (q:qs) t = (1-t)*p + t*q : linearInterp ps qs t 计算一对控制点间的线性插值的中间结果 用法:eval t b  t = 线性插值的参数值, t<-[0..1]  b = 控制点的表 返回:对n个控制点,返回n-1个插值点的表 > eval :: Float->[[Float]]->[[Float]] > eval tbi:bj:[]= [linearInterp bi bj t] > eval t (bi:bj:bs) = (linearInterp bi bj t) : eval t (bj:bs) de Casteljau算法计算Bezier曲线上一点 用法:deCas t b  t = 线性插值的参数值, t<-[0..1]  b = 控制点的表 返回:代表Bezier曲线上一个点的列表 > deCas :: Float->[[Float]]->[Float] > deCas tbi:[]= bi > deCas t bs = deCas t (eval t bs) de Casteljau算法计算沿着Bezier曲线的一系列点。点用一个列表返回。 用法:bezierCurve n b  n = 要计算的点的个数  b = Bezier控制点列表 返回:Bezier曲线上n1个点 例子:bezierCurve 50 <nowiki>[[0,0][1,1][0,1][1,0]]</nowiki> > bezierCurve :: Int->[[Float]]->[[Float]] > bezierCurve n b = [deCas (fromIntegral x / fromIntegral n) b | x<-[0 .. n] ] 

Python

(该代码用到Python图像库(页面存档备份,存于互联网档案馆))

import Image import ImageDraw SIZE=128 image = Image.new("RGB", (SIZE, SIZE)) d = ImageDraw.Draw(image) def midpoint((x1, y1), (x2, y2)): return ((x1+x2)/2, (y1+y2)/2) MAX_LEVEL = 5 def draw_curve(P1, P2, P3, P4, level=1): if level == MAX_LEVEL: d.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) draw_curve((10,10),(100,100),(100,10),(100,100)) image.save(r"c:\DeCasteljau.png", "PNG") print "ok." 

参考

  • Farin, Gerald & Hansford, Dianne (2000). The Essentials of CAGD. Natic, MA: A K Peters, Ltd. ISBN 1-56881-123-3

参看

  • Horner法:计算单项式形式多项式
  • Clenshaw算法:计算切比雪夫形式多项式

德卡斯特里奥算法, 数学子领域数值分析中的, 英語, casteljau, algorithm, 以发明者保尔, 卡斯特里奥命名, 是计算伯恩斯坦形式的多项式或貝茲曲線的递归方法, 虽然对于大部分的体系结构, 该算法和直接方法相比较慢, 但它在数值上更为稳定, 目录, 定义, 注意事项, 例子, 贝塞尔曲線, 伪代码例子, 代码实现, haskell, python, 参考, 参看定义, 编辑贝兹曲线b, 角度为n, 控制点β, displaystyle, beta, ldots, beta, 可用以下方式运用, . 数学子领域数值分析中的德卡斯特里奥算法 英語 De Casteljau s algorithm 以发明者保尔 德 卡斯特里奥命名 是计算伯恩斯坦形式的多项式或貝茲曲線的递归方法 虽然对于大部分的体系结构 该算法和直接方法相比较慢 但它在数值上更为稳定 目录 1 定义 2 注意事项 3 例子 4 贝塞尔曲線 5 伪代码例子 6 代码实现 6 1 Haskell 6 2 Python 7 参考 8 参看定义 编辑贝兹曲线B 角度为n 控制点b 0 b n displaystyle beta 0 ldots beta n 可用以下方式运用德卡斯特里奥算法 B t i 0 n b i b i n t displaystyle B t sum i 0 n beta i b i n t 其中b为伯恩施坦基本多项式 英语 Bernstein polynomial b i n t n i 1 t n i t i displaystyle b i n t n choose i 1 t n i t i 曲线在t0点上可以用遞迴關係式运算 b i 0 b i i 0 n displaystyle beta i 0 beta i mbox i 0 ldots n b i j b i j 1 1 t 0 b i 1 j 1 t 0 i 0 n j j 1 n displaystyle beta i j beta i j 1 1 t 0 beta i 1 j 1 t 0 mbox i 0 ldots n j mbox j 1 ldots n 然后 B displaystyle B 在t 0 displaystyle t 0 点上的计算可以此算法的n displaystyle n 步计算 B t 0 displaystyle B t 0 的结果为 B t 0 b 0 n displaystyle B t 0 beta 0 n 再者 贝兹曲线B displaystyle B 可在t 0 displaystyle t 0 分成带有各种控制点的两段曲线 b 0 0 b 0 1 b 0 n displaystyle beta 0 0 beta 0 1 ldots beta 0 n b 0 n b 1 n 1 b n 0 displaystyle beta 0 n beta 1 n 1 ldots beta n 0 注意事项 编辑进行手算时把系数写成三角形形式很有用 b 0 b 0 0 b 0 1 b 1 b 1 0 b 0 n b n 1 b n 1 0 b n 1 1 b n b n 0 displaystyle begin matrix beta 0 amp beta 0 0 amp amp amp amp amp beta 0 1 amp amp beta 1 amp beta 1 0 amp amp amp amp amp amp ddots amp vdots amp amp vdots amp amp beta 0 n amp amp amp amp beta n 1 amp beta n 1 0 amp amp amp amp amp beta n 1 1 amp amp beta n amp beta n 0 amp amp amp end matrix 当选择一点t0来计算波恩斯坦多项式时 我们可以用三角形形式的两个对角线来构造多项式的分段表示 B t i 0 n b i 0 b i n t t 0 1 displaystyle B t sum i 0 n beta i 0 b i n t mbox qquad t in 0 1 把它变成 B 1 t i 0 n b 0 i b i n t t 0 t 0 t 0 displaystyle B 1 t sum i 0 n beta 0 i b i n left frac t t 0 right mbox qquad t in 0 t 0 以及 B 2 t i 0 n b i n i b i n t t 0 1 t 0 t t 0 1 displaystyle B 2 t sum i 0 n beta i n i b i n left frac t t 0 1 t 0 right mbox qquad t in t 0 1 例子 编辑我们要计算2次波恩斯坦多项式 其伯恩斯坦系数为 b 0 0 b 0 displaystyle beta 0 0 beta 0 b 1 0 b 1 displaystyle beta 1 0 beta 1 b 2 0 b 2 displaystyle beta 2 0 beta 2 在t0点计算 我们有下式开始递归 b 0 1 b 0 0 1 t 0 b 1 0 t b 0 1 t 0 b 1 t 0 displaystyle beta 0 1 beta 0 0 1 t 0 beta 1 0 t beta 0 1 t 0 beta 1 t 0 b 1 1 b 1 0 1 t 0 b 2 0 t b 1 1 t 0 b 2 t 0 displaystyle beta 1 1 beta 1 0 1 t 0 beta 2 0 t beta 1 1 t 0 beta 2 t 0 递归的第二次重复结束于 b 0 2 b 0 1 1 t 0 b 1 1 t 0 b 0 1 t 0 1 t 0 b 1 t 0 1 t 0 b 1 1 t 0 t 0 b 2 t 0 t 0 b 0 1 t 0 2 2 b 1 t 0 1 t 0 b 2 t 0 2 displaystyle begin matrix beta 0 2 amp amp beta 0 1 1 t 0 beta 1 1 t 0 amp amp beta 0 1 t 0 1 t 0 beta 1 t 0 1 t 0 beta 1 1 t 0 t 0 beta 2 t 0 t 0 amp amp beta 0 1 t 0 2 2 beta 1 t 0 1 t 0 beta 2 t 0 2 end matrix 这就是我们所预料的n阶伯恩斯坦多项式 贝塞尔曲線 编辑在计算带n 1个控制点Pi的三维空间中的n次贝塞尔曲線 Bezier curve 时 B t i 0 n P i b i n t t 0 1 displaystyle mathbf B t sum i 0 n mathbf P i b i n t mbox t in 0 1 其中 P i x i y i z i displaystyle mathbf P i begin pmatrix x i y i z i end pmatrix 我们把Bezier曲线分成三个分立的方程 B 1 t i 0 n x i b i n t t 0 1 displaystyle B 1 t sum i 0 n x i b i n t mbox t in 0 1 B 2 t i 0 n y i b i n t t 0 1 displaystyle B 2 t sum i 0 n y i b i n t mbox t in 0 1 B 3 t i 0 n z i b i n t t 0 1 displaystyle B 3 t sum i 0 n z i b i n t mbox t in 0 1 然后我们用de Casteljau算法分别计算 伪代码例子 编辑这是一个递归的画出一条从点P1到P4 弯向P2和P3的曲线的伪代码例子 级数参数是递归的次数 该过程用增加了的级数参数来递归的调用它自己 当级别达到最大级别这个全局变量时 在P1和P4之间就画上直线 函数中点 midpoint 去两个点 并返回这两点间的线段的中点 global max level 5 procedure draw curve P1 P2 P3 P4 level if level gt 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 lt 0 1 返回 代表点 1 t P tQ的表 gt linearInterp Float gt Float gt Float gt Float gt linearInterp gt linearInterp p ps q qs t 1 t p t q linearInterp ps qs t 计算一对控制点间的线性插值的中间结果 用法 eval t b t 线性插值的参数值 t lt 0 1 b 控制点的表 返回 对 n个控制点 返回 n 1 个插值点的表 gt eval Float gt Float gt Float gt eval t bi bj linearInterp bi bj t gt eval t bi bj bs linearInterp bi bj t eval t bj bs 用 de Casteljau算法计算Bezier曲线上一点 用法 deCas t b t 线性插值的参数值 t lt 0 1 b 控制点的表 返回 代表 Bezier曲线上一个点的列表 gt deCas Float gt Float gt Float gt deCas t bi bi gt deCas t bs deCas t eval t bs 用 de Casteljau算法计算沿着Bezier曲线的一系列点 点用一个列表返回 用法 bezierCurve n b n 要计算的点的个数 b Bezier控制点列表 返回 Bezier曲线上n 1 个点 例子 bezierCurve 50 lt nowiki gt 0 0 1 1 0 1 1 0 lt nowiki gt gt bezierCurve Int gt Float gt Float gt bezierCurve n b deCas fromIntegral x fromIntegral n b x lt 0 n Python 编辑 该代码用到Python图像库 页面存档备份 存于互联网档案馆 import Image import ImageDraw SIZE 128 image Image new RGB SIZE SIZE d ImageDraw Draw image def midpoint x1 y1 x2 y2 return x1 x2 2 y1 y2 2 MAX LEVEL 5 def draw curve P1 P2 P3 P4 level 1 if level MAX LEVEL d 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 draw curve 10 10 100 100 100 10 100 100 image save r c DeCasteljau png PNG print ok 参考 编辑Farin Gerald amp Hansford Dianne 2000 The Essentials of CAGD Natic MA A K Peters Ltd ISBN 1 56881 123 3参看 编辑Horner法 计算单项式形式多项式 Clenshaw算法 计算切比雪夫形式多项式 取自 https zh wikipedia org w index php title 德卡斯特里奥算法 amp oldid 74172571, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。