1.实验目的:

了解曲线的生成原理,掌握几种常见的曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法。

2.实验内容:

(1) 结合示范代码了解曲线生成原理与算法实现,尤其是Bezier曲线;

(2) 调试、编译、修改示范程序。

3.实验原理:

Bezier曲线是通过一组多边形折线的顶点来定义的。如果折线的顶点固定不变,则由其定义的Bezier曲线是唯一的。在折线的各顶点中,只有第一点和最后一点在曲线上且作为曲线的起始处和终止处,其他的点用于控制曲线的形状及阶次。曲线的形状趋向于多边形折线的形状,要修改曲线,只要修改折线的各顶点就可以了。因此,多边形折线又称Bezier曲线的控制多边形,其顶点称为控制点。

三次Bezier曲线,有四个控制点,其数学表示如下:

4.实验代码:

 #include <GL/glut.h>

 #include <stdio.h>

 #include <stdlib.h>

 #include <vector>

 using namespace std;

 struct Point {

 int x, y;

 };

 Point pt[], bz[];

 vector<Point> vpt;

 bool bDraw;

 int nInput;

 void CalcBZPoints()

 {

 float a0,a1,a2,a3,b0,b1,b2,b3;

 a0=pt[].x;

 a1=-*pt[].x+*pt[].x;

 a2=*pt[].x-*pt[].x+*pt[].x;

 a3=-pt[].x+*pt[].x-*pt[].x+pt[].x;

 b0=pt[].y;

 b1=-*pt[].y+*pt[].y;

 b2=*pt[].y-*pt[].y+*pt[].y;

 b3=-pt[].y+*pt[].y-*pt[].y+pt[].y;

 float t = ;

 float dt = 0.01;

 for(int i = ; t<1.1; t+=0.1, i++)

 {

 bz[i].x = a0+a1*t+a2*t*t+a3*t*t*t;

 bz[i].y = b0+b1*t+b2*t*t+b3*t*t*t;

 }

 }

 void ControlPoint(vector<Point> vpt)

 {

 glPointSize();

 for(int i=; i<vpt.size(); i++)

 {

 glBegin (GL_POINTS);

 glColor3f (1.0f, 0.0f, 0.0f); glVertex2i (vpt[i].x,vpt[i].y);

 glEnd ();

 }

 }

 void PolylineGL(Point *pt, int num)

 {

 glBegin (GL_LINE_STRIP);

 for(int i=;i<num;i++)

 {

 glColor3f (1.0f, 1.0f, 1.0f);

 glVertex2i (pt[i].x,pt[i].y);

 }

 glEnd ();

 }

 void myDisplay()

 {

 glClear(GL_COLOR_BUFFER_BIT);

 glColor3f (1.0f, 1.0f, 1.0f);

 if (vpt.size() > ) {

 ControlPoint(vpt);

 }

 if(bDraw)

 {

 PolylineGL(pt, );

 CalcBZPoints();

 PolylineGL(bz, );

 }

 glFlush();

 }

 void Init()

 {

 glClearColor(0.0, 0.0, 0.0, 0.0);

 glShadeModel(GL_SMOOTH);

 printf("Please Click left button of mouse to input control point of Bezier Curve!\n");

 }

 void Reshape(int w, int h)

 {

 glViewport(, , (GLsizei) w, (GLsizei) h);

 glMatrixMode(GL_PROJECTION);

 glLoadIdentity();

 gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);

 }

 void mouse(int button, int state, int x, int y)

 {

 switch (button)

 {

 case GLUT_LEFT_BUTTON:

 if (state == GLUT_DOWN)

 {

 if (nInput == )

 {

 pt[].x = x;

 pt[].y =  - y;

 nInput = ;

 vpt.clear();

 vpt.push_back(pt[]);

 bDraw = false;

 glutPostRedisplay();//

 }

 else if (nInput == )

 {

 pt[].x = x;

 pt[].y =  - y;

 vpt.push_back(pt[]);

 nInput = ;

 glutPostRedisplay();//

 }

 else if (nInput == )

 {

 pt[].x = x;

 pt[].y =  - y;

 vpt.push_back(pt[]);

 nInput = ;

 glutPostRedisplay();//

 }

 else if (nInput == )

 {

 pt[].x = x;

 pt[].y =  - y;

 bDraw = true;

 vpt.push_back(pt[]);

 nInput = ;

 glutPostRedisplay();//

 }

 }

 break;

 default:

 break;

 }

 }

 int main(int argc, char *argv[])

 {

 glutInit(&argc, argv);

 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

 glutInitWindowPosition(, );

 glutInitWindowSize(, );

 glutCreateWindow("Hello World!");

 Init();

 glutDisplayFunc(myDisplay);

 glutReshapeFunc(Reshape);

 glutMouseFunc(mouse);

 glutMainLoop();

 return ;

 }

附上本实验的VC++工程代码(VC++2008)

5.实验提高

尝试实现B样条曲线算法。

实验6 Bezier曲线生成的更多相关文章

  1. 曲线生成与求交—Bezier曲线

    Bezier曲线生成 法国工程师Pierre Bezier在雷诺公司使用该方法来设计汽车.一条Bezier曲线可以拟合任何数目的控制点. 公式 设\(n+1\)个控制点\(P_0,P_1--P_n\) ...

  2. [摘抄] Bezier曲线、B样条和NURBS

    Bezier曲线.B样条和NURBS,NURBS是Non-Uniform Rational B-Splines的缩写,都是根据控制点来生成曲线的,那么他们有什么区别了?简单来说,就是: Bezier曲 ...

  3. C# 实现Bezier曲线(vs2008)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

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

    (a)Bezier曲线                         (b) Bezier曲面 1. 绘制Bezier曲线 #include <GL/glut.h> GLfloat ct ...

  5. python bezier 曲线

    1.手写bezier公式,生成bezier代码, 如果给的点数过多,则会生成一半bezier曲线,剩下的一半就需要进行拼接: import numpy as np import matplotlib. ...

  6. 曲线生成与求交—B样条曲线

    B样条曲线生成 Bezier曲线缺点:改变任一控制点的位置,将影响整条曲线的形状. B样条曲线是对Bezier曲线的改进,可进行局部控制,生成的曲线与控制多边形的外形更接近,将Bezier曲线作为一特 ...

  7. Bezier曲线的原理 及 二次Bezier曲线的实现

    原文地址:http://blog.csdn.net/jimi36/article/details/7792103 Bezier曲线的原理 Bezier曲线是应用于二维图形的曲线.曲线由顶点和控制点组成 ...

  8. 连续bezier曲线的实现

    需求场景 一系列的坐标点,划出一条平滑的曲线 3次Bezier曲线 基本上大部分绘图工具都实现了3次Bezier曲线,4个点确定一条3次Bezier曲线.以html5中的canvas为例 let ct ...

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

    简单而粗暴的方法画任意阶数Bezier曲线 虽然说是任意阶数,但是嘞,算法原理是可以到任意阶数,计算机大概到100多阶就会溢出了 Bezier曲线介绍] [本文代码] 背景 在windows的Open ...

随机推荐

  1. 15.5.6 【Task实现细节】跟踪栈

    谈到栈帧(stack frame)时,可能会想到在方法中声明的局部变量.当然,可能还会注意到 一些隐藏的局部变量,如 foreach 循环中的迭代器.但栈上的内容不止这些,至少逻辑上是这样  . 很多 ...

  2. [Ynoi2015]我回来了

    题目大意: 给定一张无向无权图,每次给定若干个二元组\((x_i,y_i)\),定义点\(u\)满足条件,当且仅当存在\(i\),并满足\(dist(u,x_i)\leqslant y_i\)(\(d ...

  3. nginx下部署showdoc

    1. 安装nginx服务器sudo apt-get install nginx -y 2. 启动服务sudo service nginx start 3. 安装php环境 sudo apt-get i ...

  4. android debug签名文件

    现象 可以运行程序,但不能启动安装成功的软件 并且run application的时候也不弹出界面. 路径: C:\Users\sunfb\.android 下替换debug.keystore 就OK

  5. 如何使用qtp12 utf进行功能测试

    首先,按照本博客的安装教程走的,右键管理员运行 接下来点击继续,这个界面只需要勾选到web即可 点击ok,开始运行 进入到主界面之后,file新建一个测试. 可以修改路径等等 点击create之后,出 ...

  6. 【[Offer收割]编程练习赛10 C】区间价值

    [题目链接]:http://hihocoder.com/problemset/problem/1483 [题意] 中文题 [题解] 二分最后的答案; 二分的时候; 对于每一个枚举的值x; 计算小于等于 ...

  7. 转载 - 汇编--INT 10H功能

    出处:http://www.cnblogs.com/magic-cube/archive/2011/10/19/2217676.html INT 10H 是由 BIOS 对屏幕及显示器所提供的服务程序 ...

  8. COGS——C610. 数对的个数

    http://cogs.pro/cogs/problem/problem.php?pid=610 Description出题是一件痛苦的事情!题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B P ...

  9. currentThread()方法返回代码段正在被哪个线程调用

    currentThread()方法返回代码段正在被哪个线程调用 package com.stono.thread2.page16; public class MyThread extends Thre ...

  10. AIX中查看进程内存使用

    AIX中查看进程内存使用 学习了:http://www.2cto.com/os/201308/235858.html 1,从大到小排列10个内存使用率进程 ps aux |  head -1 ;  p ...