【OpenGL】交互式三次 Bezier 曲线
1. 来源
三次贝塞尔曲线就是依据四个位置任意的点坐标绘制出的一条光滑曲线

2. 公式

3. 实现
#include <iostream>
#include <math.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <vector>
//#include <pair> using namespace std; //points保存四个点
vector<pair<GLfloat, GLfloat> > points;
//设置两个bool变量来记录是否已经画出四个点之间的直线,以及相关贝塞尔曲线
bool line = false;
bool curve = false; //画直线
void drawLine() {
glColor3f(1.0f, , );
glPointSize(1.0);
for (int i = ; i <= ; i ++) {
glBegin(GL_LINES);
glVertex2f(points[i].first, points[i].second);
glVertex2f(points[i+].first, points[i+].second);
glEnd();
}
} //贝塞尔曲线
void drawCurve() {
glColor3f(, 1.0f, );
glPointSize(1.0);
for (GLfloat t = ; t <= 1.0; t += 0.001) {
GLfloat x = points[].first*pow(1.0f-t, ) + *points[].first*t*pow(1.0f-t, ) + *points[].first*t*t*(1.0f-t) + points[].first*pow(t, );
GLfloat y = points[].second*pow(1.0f-t, ) + *points[].second*t*pow(1.0f-t, ) + *points[].second*t*t*(1.0f-t) + points[].second*pow(t, );
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
} //初始化函数
void myInit() {
glClearColor(, , , );
glColor3f(1.0f, , );
glPointSize(5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluOrtho2D(0.0, , 0.0, );
} void myDisplay() {
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
} //对于鼠标点击的响应函数
void myMouse(int button, int state, int x, int y)
{
//按下鼠标左键
if(state==GLUT_DOWN)
{
//画4个点
if (points.size() < ) {
glBegin(GL_POINTS);
glVertex2i(x, - y);
glEnd();
points.push_back(make_pair(GLfloat(x), GLfloat( - y)));
}
//若已经画好四个点,则开始画点连成的线段\曲线
else if (points.size() == ) {
//线段
if (line == false) {
drawLine();
line = true;
}
//曲线
else if (line == true && curve == false) {
drawCurve();
curve = true;
}
//清空
else if (line == true && curve == true) {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, , );
glPointSize(5.0);
line = false;
curve = false;
while(!points.empty()) {
points.pop_back();
}
}
}
glFlush();
}
} int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowPosition(, );
glutInitWindowSize(, );
glutCreateWindow("Bezier-curve"); myInit();
glutDisplayFunc (myDisplay);
glutMouseFunc(myMouse);
glutMainLoop();
return ;
}
4. 延伸
一次、二次、五次贝赛尔曲线以及贝塞尔曲线的升阶,具体:
https://zh.wikipedia.org/zh-cn/%E8%B2%9D%E8%8C%B2%E6%9B%B2%E7%B7%9A
【OpenGL】交互式三次 Bezier 曲线的更多相关文章
- 实验6 Bezier曲线生成
1.实验目的: 了解曲线的生成原理,掌握几种常见的曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法. 2.实验内容: (1) 结合示范代码了解曲线生成原理与算法实现,尤其是Bezier ...
- Bezier曲线的原理 及 二次Bezier曲线的实现
原文地址:http://blog.csdn.net/jimi36/article/details/7792103 Bezier曲线的原理 Bezier曲线是应用于二维图形的曲线.曲线由顶点和控制点组成 ...
- 曲线生成与求交—Bezier曲线
Bezier曲线生成 法国工程师Pierre Bezier在雷诺公司使用该方法来设计汽车.一条Bezier曲线可以拟合任何数目的控制点. 公式 设\(n+1\)个控制点\(P_0,P_1--P_n\) ...
- CSS3 三次贝塞尔曲线(cubic-bezier)
例子:transition:all 1s cubic-bezier(.21,.2,.65,.1) 最近在看animation模块,其中animation-timing-function 和 trans ...
- OpenGL超级宝典笔记——贝塞尔曲线和曲面(转)
http://my.oschina.net/sweetdark/blog/183721 参数方程表现形式 在中学的时候,我们都学习过直线的参数方程:y = kx + b;其中k表示斜率,b表示截距(即 ...
- 简单而粗暴的方法画任意阶数Bezier曲线
简单而粗暴的方法画任意阶数Bezier曲线 虽然说是任意阶数,但是嘞,算法原理是可以到任意阶数,计算机大概到100多阶就会溢出了 Bezier曲线介绍] [本文代码] 背景 在windows的Open ...
- 二次、三次贝塞尔曲线demo(演示+获取坐标点)
二次贝塞尔曲线demo: See the Pen quadraticCurveDemo by hanyanjun (@hanyanjun) on CodePen. 我的demo地址(二次) 推荐点击以 ...
- VC 三点 划 曲线
y = ax2+bx+c 条件,三点成一曲线 pointone(x1,y1)//(y1在X柱上,必须为零,如果不为零这个公式要重新求值) pointtwo(x2,y2)// 可以为任意值 pointt ...
- [js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具)
之前,我写了一个arc函数的用法:[js高手之路] html5 canvas系列教程 - arc绘制曲线图形(曲线,弧线,圆形). arcTo: cxt.arcTo( cx, cy, x2, y2, ...
随机推荐
- Servlet获得Http请求,GET/POST
Servlet获得Http请求 Http请求信息格式 请求行(方法提交方式,URI,Http协议版本) GET方式提交:URI会包含查询字符串 POST方式提交:URI不会包含查询字符串 请求头 Ho ...
- oracle user account locked
1.Question describe when you use account scott/tiger connect to oracle, you will see "the user ...
- Python 学习笔记1
1.Python2.x与3.x版本区别 2.常量与变量 3.if elif else 4.注释 5.用户交互 6.字符串拼接 7.文件扩展名 8.缩进 9.运算符 10.while循环 Pyt ...
- 如何选择RabbitMQ的消息保存方式?
RabbitMQ对于queue中的message的保存方式有两种方式:disc和ram.如果采用disc,则需要对exchange/queue/delivery mode都要设置成durable模式. ...
- Exchange 2013 、Lync 2013、SharePoint 2013
Office办公系列 在企业中广泛应用,目前服务的客户当中,部分客户已经应用到了 Exchange.Lync.CRM.SharePoint等产品,在开发当中多多少少会涉及到集成,为了更好的服务客户.了 ...
- Sass学习之路(3)——Sass编译
Sass的编译也是在我们使用Sass的时候必须要经过的一个步骤,因为".sass"和".scss"文件并不能直接使用<link>标签引用,最终其实还 ...
- copy 和 strong(或retain)的区别
http://stackoverflow.com/questions/18526909/whether-i-should-use-propertynonatomic-copy-or-propertyn ...
- css权重是什么
css权重是什么? 概述 css Specificity中文一般译为css优先级.css权重.相比"权重","优先级"更好理解,mozilla官方中文文档就翻译 ...
- 无法将类型为“Excel.ApplicationClass”的 COM 对象强制转换为接口类 型“Excel._Application”。此操作失败的原因是对 IID 为“{000208D5 -0000-0000-C000-000000000046}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 加载类型库/DLL 时出错。 (异常来 自 HRESULT:
无法将类型为“Excel.ApplicationClass”的 COM 对象强制转换为接口类 型“Excel._Application”.此操作失败的原因是对 IID 为“{000208D5 -000 ...
- 【转】Hadoop web页面的授权设定
转载自过往记忆(http://www.iteblog.com/)本文链接地址: <Hadoop web页面的授权设定>(http://www.iteblog.com/archives/98 ...