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()

运行截图:

原文地址:https://www.cnblogs.com/swenw/p/12232391.html

时间: 2024-10-28 14:31:24

Bezier曲线的实现——de Casteljau算法的相关文章

de Casteljau算法的matlab实现

一直在写c++程序,不过对于一些作图程序来说,还是MATLAB比较实在. de Casteljau算法是作贝塞尔曲线的一种高效的算法,其思想就是对[0,1]区间中所有的t,通过n个控制顶点不断递推得到一个顶点:下面是我的代码实现: function deCasteljau(P,Q) %P is 1*n matrix for X %Q is 1*n matrix for Y m=size(P); n=m(2); x=zeros(1,101); y=zeros(1,101); p=zeros(n);

Bezier曲线(1):Introducion

搬运自我的CSDN https://blog.csdn.net/u013213111/article/details/94067849 参考: 贝塞尔曲线扫盲 贝塞尔曲线的理解 使用贝塞尔曲线绘制多点连接曲线 Bezier curves and surfaces Bezier Curve Drawing Algorithms Construction of Bézier Curves 首先来直观地看一下Bezier曲线是什么样的. 这是个二次Bezier曲线,经过 \(P_0\) 和 \(P_2

Bezier曲线原理—动态解释

Bezier曲线原理 贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线.一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的.贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如PhotoShop等.在Flash4中还没有完整的曲线工具,而在Flash5里面已经提供出贝塞尔曲线工具.贝塞尔曲线于19

计算机图形学(二)输出图元_6_OpenGL曲线函数_1_圆生成算法

OpenGL曲线函数 生成圆和椭圆等基本曲线的函数并未作为图元功能包含在OpenGL核心库中.但该库包含了显示Bezier样条的功能,该曲线是由一组离散点定义的多项式.OpenGL实用库(GLU)中包含有球面和柱面等三维曲面函数以及生成B样条的函数,它是包含简化Bezier曲线的样条曲线的总集.我们可以使用有理B样条显示圆.椭圆和其他二维曲线.此外,OpenGL实用工具包(GLUT)中还有可以用来显示某些三维曲面(如球面.锥面和其他形体)的函数.然而,所有这些函数比本章中介绍的基本图元应用得更多

清华版CG 实验6 Bezier曲线生成

1.实验目的: 了解曲线的生成原理,掌握几种常见的曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法. 2.实验内容: (1) 结合示范代码了解曲线生成原理与算法实现,尤其是Bezier曲线: (2) 调试.编译.修改示范程序. 3.实验原理: Bezier曲线是通过一组多边形折线的顶点来定义的.如果折线的顶点固定不变,则由其定义的Bezier曲线是唯一的.在折线的各顶点中,只有第一点和最后一点在曲线上且作为曲线的起始处和终止处,其他的点用于控制曲线的形状及阶次.曲线的形状趋向于多

简单而粗暴的方法画任意阶数Bezier曲线

简单而粗暴的方法画任意阶数Bezier曲线 虽然说是任意阶数,但是嘞,算法原理是可以到任意阶数,计算机大概到100多阶就会溢出了 Bezier曲线介绍 本文代码 背景 在windows的OpenGL环境中,使用鼠标在屏幕上选点,并以点为基础画出Bezier曲线 初始化 鼠标操作 3阶以内Bezier曲线 n阶Bezier曲线 初始化 创建窗口,初始化大小.显示模式.添加显示和鼠标等回调函数,设置背景颜色等. 完成之后,定义两个全局的int类型的vector 用于存储鼠标在窗口中选择的点.同时定义

OpenGL绘制简单的参数曲线——三阶Bezier曲线(二)

今天我们来介绍三次Bezier曲线,这曲线网上资料非常多,我这里只是简单介绍下原理. 在二维空间中(三维也类似),给定n+1个点P0.P1.... .Pn.参数t的n次的Bezier曲线是: 图1 我们根据上面式子可以推出一阶.二阶.三阶贝塞尔曲线,下面是一阶贝塞尔曲线: 图2 下面是二阶贝塞尔曲线,表示的是从P0P1线段取Q0,P1P2线段取Q1,每一个Q0Q1都是曲线的切向量: 图3 下面是三阶贝塞尔曲线,表示的是从P0P1线段取Q0,P1P2线段取Q1,P2P3线段取Q2,再从Q0Q1取R

7.5.5编程实例-Bezier曲线曲面绘制

(a)Bezier曲线                         (b) Bezier曲面 1. 绘制Bezier曲线 #include <GL/glut.h> GLfloat ctrlpoints[4][3] = {{ -4.0, -4.0, 0.0}, { -2.0, 3.0, 0.0}, {2.0, 4.5, 0.0}, {3.0, -3.0, 0.0}}; void init(void) { glClearColor(1.0, 1.0, 1.0, 0.0); glShadeMod

Bezier曲线绘制 B样条绘制

/*输入点的个数是可以手动改动的,此程序中输入点的最大值设置为. *同时,程序实现了键盘的交互,用来控制程序运行过程中的退出.重画等 */ #include<GL/glut.h> #include<stdlib.h> int W,H; //屏幕的大小 int N =-1; //贝赛尔曲线的幂次 GLfloat Bfunc[15]={0.0}; //Bernstein多项式的值的数组 GLfloat point[15][2]={0.0}; //存储控制点的坐标 void Init()