Bezier曲线的实现——de Casteljau算法

Posted swenw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bezier曲线的实现——de Casteljau算法相关的知识,希望对你有一定的参考价值。

这学期同时上了计算机图形学和计算方法两门课,学到这部分的时候突然觉得de Casteljau递推算法特别像牛顿插值,尤其递推计算步骤很像牛顿差商表。

一开始用伯恩斯坦多项式计算Bezier曲线的时候,由于其多项式的计算十分不利于计算机实现,还会出现数值不稳定的情况

所以后来出现了de Casteljau算法,以下PPT截图来自北京化工大学李辉老师

技术图片

 

 

 实现代码(六个顶点):

import numpy as np
import matplotlib.pyplot as plt

#B = (1-t)*P0+t*P1
def one_bezier_curve(a, b, t):
    return (1-t)*a + t*b

#使用de Casteljau算法求解曲线
def n_bezier_curve(x, n, k, t):
    #当且仅当为一阶时,递归结束
    if n == 1:
        return one_bezier_curve(x[k], x[k+1], t)
    else:
        return (1-t)*n_bezier_curve(x, n-1, k, t) + t*n_bezier_curve(x, n-1, k+1, t)
 
def bezier_curve(x, y, num, b_x, b_y):
    #n表示阶数
    n = len(x) - 1
    t_step = 1.0 / (num - 1)
    t = np.arange(0.0, 1+t_step, t_step)
    for each in t:
        b_x.append(n_bezier_curve(x, n, 0, each))
        b_y.append(n_bezier_curve(y, n, 0, each))
 
if __name__ == "__main__":
    x = [int(n) for n in input(x:).split()]
    y = [int(n) for n in input(y:).split()]
    plt.plot(x, y)
    # x = [0, 2, 5, 10, 15, 20]
    # y = [0, 6, 10, 0, 5, 5]
    num = 100
    b_x = []
    b_y = []
    bezier_curve(x, y, num, b_x, b_y)
    plt.plot(b_x, b_y)
    
    plt.show()

 

运行截图:

技术图片

 

以上是关于Bezier曲线的实现——de Casteljau算法的主要内容,如果未能解决你的问题,请参考以下文章

12月学习进度6/31——计算机图形学期末准备03Bezier曲线及MATLAB实现

bezier曲线的应用

bezier曲线的一个计算问题

Bezier(贝塞尔)曲线简介

曲线理论-详解Bezier曲线B样条曲线NURBS曲线

曲线理论-详解Bezier曲线B样条曲线NURBS曲线