实验6 Bezier曲线生成
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曲线生成的更多相关文章
- 曲线生成与求交—Bezier曲线
		
Bezier曲线生成 法国工程师Pierre Bezier在雷诺公司使用该方法来设计汽车.一条Bezier曲线可以拟合任何数目的控制点. 公式 设\(n+1\)个控制点\(P_0,P_1--P_n\) ...
 - [摘抄] Bezier曲线、B样条和NURBS
		
Bezier曲线.B样条和NURBS,NURBS是Non-Uniform Rational B-Splines的缩写,都是根据控制点来生成曲线的,那么他们有什么区别了?简单来说,就是: Bezier曲 ...
 - C# 实现Bezier曲线(vs2008)
		
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
 - 7.5.5编程实例-Bezier曲线曲面绘制
		
(a)Bezier曲线 (b) Bezier曲面 1. 绘制Bezier曲线 #include <GL/glut.h> GLfloat ct ...
 - python bezier 曲线
		
1.手写bezier公式,生成bezier代码, 如果给的点数过多,则会生成一半bezier曲线,剩下的一半就需要进行拼接: import numpy as np import matplotlib. ...
 - 曲线生成与求交—B样条曲线
		
B样条曲线生成 Bezier曲线缺点:改变任一控制点的位置,将影响整条曲线的形状. B样条曲线是对Bezier曲线的改进,可进行局部控制,生成的曲线与控制多边形的外形更接近,将Bezier曲线作为一特 ...
 - Bezier曲线的原理 及 二次Bezier曲线的实现
		
原文地址:http://blog.csdn.net/jimi36/article/details/7792103 Bezier曲线的原理 Bezier曲线是应用于二维图形的曲线.曲线由顶点和控制点组成 ...
 - 连续bezier曲线的实现
		
需求场景 一系列的坐标点,划出一条平滑的曲线 3次Bezier曲线 基本上大部分绘图工具都实现了3次Bezier曲线,4个点确定一条3次Bezier曲线.以html5中的canvas为例 let ct ...
 - 简单而粗暴的方法画任意阶数Bezier曲线
		
简单而粗暴的方法画任意阶数Bezier曲线 虽然说是任意阶数,但是嘞,算法原理是可以到任意阶数,计算机大概到100多阶就会溢出了 Bezier曲线介绍] [本文代码] 背景 在windows的Open ...
 
随机推荐
- Vue.js大总结
			
最近回顾了一下Vue.js的基础知识,把认为重要的几个点简单的罗列了出来 vue渐进式的理解 vue可以开发很多插件,可以把很多插件组合到一起,渐进的增加vue的功能 update beforeUpd ...
 - Linux—Ubuntu14.0.5安装mongo
			
1.安装mongo sudo apt-get install mongo 2.如果遇到找不到安装包运行,那就更新资源列表 sudo apt-get update 3.安装成功会自动运行mongo pg ...
 - 解决windows文件在linux系统中显示乱码的问题
			
问题: 在Windows下用matlab写的代码(.m)到Linux(centos)下,注释的中文全是乱码. 原因: Windows下默认使用的是GB2312编码,Linux默认使用的是UTF-8. ...
 - 解决@vue/cli 创建项目是安装chromedriver时失败的问题
			
最近在使用新版vue的命令行工具创建项目时,安装chromedriver老是失败,导致后面的步骤也没有进行.网上搜索了一下,全是使用 工作中常见问题汇总及解决方案 npm install chrome ...
 - struts2中<jsp:forward>跳转时报404错误的问题
			
index.jsp页面: <jsp:forward page="show.action"></jsp:forward> 在struts.x ...
 - 【hihocoder 1329】	平衡树·Splay(set做法)
			
[题目链接]:http://hihocoder.com/problemset/problem/1329 [题意] [题解] 因为一开始是空的树,所以; n其实就代表了树中的最多元素个数; 则最坏的情况 ...
 - ExtJs之Ext.comboBox的远程数据源读取程序
			
既然可以测试本地AJAX,那就把书前面的代码作一次学习吧. <!DOCTYPE html> <html> <head> <title>ExtJs< ...
 - 洛谷 P2121 拆地毯
			
P2121 拆地毯 题目背景 还记得 NOIP 2011 提高组 Day1 中的铺地毯吗?时光飞逝,光阴荏苒,三年过去了.组织者精心准备的颁奖典礼早已结束,留下的则是被人们踩过的地毯.请你来解决类似于 ...
 - HDU 1115
			
题意很明白要求多边形重心.方法已在上篇讲过了. #include <iostream> #include <cstdio> #include <cstring> # ...
 - 使用makeself创建安装文件
			
Makeself.sh是一个小的Shell脚本.用于从一个文件夹中生成自解压的tar.gz压缩包. 结果文件以一个shell脚本显示(大多数以.run作为后缀名).能够自己主动执行.该文档会解压自己到 ...