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 曲线的更多相关文章

  1. 实验6 Bezier曲线生成

    1.实验目的: 了解曲线的生成原理,掌握几种常见的曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法. 2.实验内容: (1) 结合示范代码了解曲线生成原理与算法实现,尤其是Bezier ...

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

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

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

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

  4. CSS3 三次贝塞尔曲线(cubic-bezier)

    例子:transition:all 1s cubic-bezier(.21,.2,.65,.1) 最近在看animation模块,其中animation-timing-function 和 trans ...

  5. OpenGL超级宝典笔记——贝塞尔曲线和曲面(转)

    http://my.oschina.net/sweetdark/blog/183721 参数方程表现形式 在中学的时候,我们都学习过直线的参数方程:y = kx + b;其中k表示斜率,b表示截距(即 ...

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

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

  7. 二次、三次贝塞尔曲线demo(演示+获取坐标点)

    二次贝塞尔曲线demo: See the Pen quadraticCurveDemo by hanyanjun (@hanyanjun) on CodePen. 我的demo地址(二次) 推荐点击以 ...

  8. VC 三点 划 曲线

    y = ax2+bx+c 条件,三点成一曲线 pointone(x1,y1)//(y1在X柱上,必须为零,如果不为零这个公式要重新求值) pointtwo(x2,y2)// 可以为任意值 pointt ...

  9. [js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具)

    之前,我写了一个arc函数的用法:[js高手之路] html5 canvas系列教程 - arc绘制曲线图形(曲线,弧线,圆形). arcTo: cxt.arcTo( cx, cy, x2, y2, ...

随机推荐

  1. PHP框架Swoole的一个定时器Timer特性

    在各种业务型系统中,往往需要服务器在后台扫描相关数据,触发相应的统计.通知等操作. 比如对于一个项目管理系统,需要每天的特定时间内,统计每项任务的执行.到期情况.整个项目的进度等等,根据统计情况,做相 ...

  2. [moka同学摘录]在Centos 6.5下成功安装和配置了vim7.4

    来源:https://my.oschina.net/gzyh/blog/266097 资源下载地址: 链接:http://pan.baidu.com/s/1kVuaV5P 密码:xkq9   摘要: ...

  3. mongodb学习3---mongo的MapReduce

    1,概述MapReduce是个非常灵活和强大的数据聚合工具.它的好处是可以把一个聚合任务分解为多个小的任务,分配到多服务器上并行处理.MongoDB也提供了MapReduce,当然查询语肯定是Java ...

  4. MaterialRefreshLayout

    以上就介绍了比SwipeRefreshLayout更漂亮和强大的下拉刷新控件:Android-MaterialRefreshLayout 1.xml <?xml version="1. ...

  5. jDiameter介绍以及使用

    jDiameter是Diameter协议的开源实现(比较不幸的是AGPL 3.0协议),项目地址https://github.com/RestComm/jdiameter. 项目框架 jDiamete ...

  6. webpack常用的插件安装命令

    webpack常用的插件安装命令:1:npm install html-webpack-plugin --save-dev //自动快速的帮我们生成HTML.2:npm install css-loa ...

  7. java中判断字符串是否为数字的方法

    一: //1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < str.length(); ...

  8. 转:纠结的Shim

    原文地址:http://www.haorooms.com/post/requirejs_sy_lj RequireJs已经流行很久了,它提供了以下功能: 声明不同js文件之间的依赖 可以按需.并行.延 ...

  9. Ubuntu下修改system.img 解包system.img、打包system.img

    一.准备工作:解压解打包工具,得到三个文件:make_ext4fs.mkuserimg.sh.simg2img,把它们跟要修改的 .img.ext4(或.img)文件放置到同一个目录下 二.转换源文件 ...

  10. Jenkins部署.net自动化构建

    1.环境部署: windows server 2008R2环境   2.相关软件 SVN(源代码管理器:jenkins通过插件从源代码管理器下载代码)   Jenkins(主角)地址:http://f ...