【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, ...
随机推荐
- MSIL指令集
名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...
- Vs2012出现停止工作问题的解决方法
我的VS2012总是出现问题,打开项目会,更改移动控件位置也会,后来在网上找到了解决方法 这是出现问题
- csharp: InvokeHelper
Entity Framework https://entityframework.codeplex.com/ Enterprise Library https://entlib.codeplex.co ...
- asp.net 前台绑定后台变量方法总结:<%= %> 和<%# %>的区别
经常会碰到在前台代码中要使用(或绑定)后台代码中变量值的问题.一般有<%= str%>和<%# str %>两种方式,这里简单总结一下.如有错误或异议之处,敬请各位指教. 一 ...
- 状态压缩DP---Hie with the Pie
http: //acm.hust.edu.cn/vjudge/contest/view.action?cid=110044#problem/B Description The Pizazz Pizze ...
- DShow实现一个avi视频的播放(含有个人解释和注释)
此项目为win32下的控制台C++代码(别忘记配置DShow库) // movie_test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" ...
- [js开源组件开发]-手机端照片预览组件
手机端照片预览组件 可怜的我用着华为3C手机,用别人现成的组件都好卡,为了适应我这种屌丝,于是自己简化写了一版的照片预览效果,暂时无缩放功能,以后可能有空再加吧,你也可以自己加下,这是个github上 ...
- 如果一个游戏上面加一个透明层,js能不能实现 点击透明层的任意点 而正常玩游戏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CSS 属性 - 伪类和伪元素的区别
伪类和伪元素皆独立于文档结构.它们获取元素的途径也不是基于id.class.属性这些基础的元素特征,而是在处于特殊状态的元素(伪类),或者是元素中特别的内容(伪元素).区别总结如下: ①写法不一样: ...
- 案例分享:电信行业零售业务CRM架构
最近跟一个客户讨论销售领域的移动化需求,谈到了他们的零售业务系统的整体框架,觉得很有分享的必要. 这次聊到的客户是电信行业的巨头,说的是他们的零售业务.电信公司么,卖出去的无非是设备和服务.大体的业务 ...