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. HDU 2159---FATE---带限制的完全背包

    HDU   2159 Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一 ...

  2. jQuery使用ajaxStart()和ajaxStop()方法

    ajaxStart()和ajaxStop()方法是绑定Ajax事件.ajaxStart()方法用于在Ajax请求发出前触发函数,ajaxStop()方法用于在Ajax请求完成后触发函数.它们的调用格式 ...

  3. JavaWebSession

    一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...

  4. poolboy的坑

    poolboy是Erlang中运用非常广泛的进程池库,它有很多优点,使用简单,在很多项目中都能看到它的身影.不过,它也有一些坑,使用时候需要注意.(本文对poolboy的分析基于1.5.1版本) wo ...

  5. js注入,黑客之路必备!

    最近刚出了新闻,阿里四名网络安全部门员工利用网页漏洞写js脚本抢月饼,于是兴致来了,想了解一下这个js脚本到底怎么写,各种刷单各种抢枪抢又是怎么实现的. 什么是javascript注入攻击? 1.每当 ...

  6. .NET Core 和 ASP.NET 5 RC1 发布

    昨天微软发布了 .NET Core 和 ASP.NET 5 候选版本,支持 Windows,Linux 和 OS X 平台,版本 License 为 "Go Live",,也就是说 ...

  7. mysql ALL_O_DIRECT引发的unaligned AIO/DIO导致hang

    公司内部有一套mysql环境,使用的是percona server分支(和其他几十套环境的版本.参数完全相同),就这套环境每隔两三天就会hang一次,关键hang的时候服务器cpu也就是百分之三四十, ...

  8. ADO.NET 完整的修改和删除

    namespace 完整修改{ class Program { static void Main(string[] args) { bool has = false; Console.Write(&q ...

  9. PHP PEAR2

    出错: Pyrus\Installer\Exception: Installation failed Pyrus\AtomicFileTransaction\MultiException: Unabl ...

  10. 一个页面从输入 URL 到页面加载完的过程中都发生了什么事情?

    过程概述 浏览器查找域名对应的 IP 地址: 浏览器根据 IP 地址与服务器建立 socket 连接: 浏览器与服务器通信: 浏览器请求,服务器处理请求: 浏览器与服务器断开连接. 以下为详细解析: ...