OpenGL绘制贝塞尔曲线
作者:薛昭君 发布时间:2022-02-28 11:51:57
标签:OpenGL,贝塞尔曲线
本文实例为大家分享了OpenGL绘制贝塞尔曲线的具体代码,供大家参考,具体内容如下
最终效果图:
通过3个点形成一条贝塞尔曲线
1. 鼠标问题
在使用鼠标获取坐标的时候,要知道鼠标获取的坐标和屏幕坐标是不同的;
openGL使用右手坐标
从左到右,x递增
从下到上,y递增
从远到近,z递增
而鼠标是从左到右增x,同时从上到下也是增y
所以在求 y 的时候,用(屏幕大小-y)来获取
2. 绘制
setpoint 用来绘制点
setline 用来绘制线
setBezier 用来绘制贝塞尔曲线
其中公式的意义可以参考百科:
实际绘制的时候就是不断的增加t,求出下一点的值然后将两个链接起来,然后再将下一个点作为起点,再求出下下一个点
Api解释在代码中
#include "GL\glut.h"
#include <math.h>
#include <Windows.h>
//这是一个点的类,用于存储其中点的坐标
class Point
{
public:
int x, y;
void setxy(int _x, int _y) {
x = _x;
y = _y;
}
};
//点的数量
static int POINTSNUM = 0;
//用于存储点的集合,因为绘制的都是4个点的贝塞尔曲线,所以数组大小为4
static Point points[4];
//初始化函数
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0); //设定背景为黑色
glColor3f(0.0,0.0,0.0); //绘图颜色为白色
glPointSize(2.0); //设定点的大小为2*2像素的
glMatrixMode(GL_PROJECTION); // 设定合适的矩阵
glLoadIdentity(); // 是一个无参的无值函数,其功能是用一个4×4的单位矩阵来替换当前矩阵,实际上就是对当前矩阵进行初始化。也就是说,无论以前进行了多少次矩阵变换,在该命令执行后,当前矩阵均恢复成一个单位矩阵,即相当于没有进行任何矩阵变换状态
gluOrtho2D(0.0,600.0,0.0,480.0); //平行投影,四个参数分别是x,y范围
}
//绘制点
void setPoint(Point p) {
glBegin(GL_POINTS);
glVertex2f(p.x, p.y);
glEnd();
glFlush();
}
// 绘制直线
void setline(Point p1, Point p2) {
glBegin(GL_LINES);
glVertex2f(p1.x,p1.y);
glVertex2f(p2.x, p2.y);
glEnd();
glFlush();
}
// 绘制贝塞尔曲线
Point setBezier(Point p1, Point p2, Point p3, Point p4,double t) {
Point p;
double a1 = pow((1 - t), 3);
double a2 = pow((1 - t), 2) * 3 * t;
double a3 = 3 * t*t*(1 - t);
double a4 = t*t*t;
p.x = a1*p1.x + a2*p2.x + a3*p3.x + a4*p4.x;
p.y = a1*p1.y + a2*p2.y + a3*p3.y + a4*p4.y;
return p;
}
//display函数
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
// 鼠标事件
void mymouseFunction(int button, int state, int x, int y) {
if (state == GLUT_DOWN) // 如果鼠标按下,不区分左右键的
{
points[POINTSNUM].setxy(x,480- y); // 这里求鼠标点的坐标的时候
// 设置点的颜色,绘制点
glColor3f(1.0,0.0,0.0);
setPoint(points[POINTSNUM]);
// 设置线的颜色,绘制线
glColor3f(1.0,0.0,0.0);
if(POINTSNUM > 0) setline(points[POINTSNUM-1],points[POINTSNUM]);
//如果达到了4个绘制贝塞尔曲线,并在之后给计数器清零
if (POINTSNUM == 3) {
//绘制贝塞尔曲线
glColor3f(0.0, 0.0, 1.0); // 设定贝塞尔曲线的颜色
Point p_current = points[0]; //设为起点
for (double t = 0.0; t <= 1.0; t += 0.05)
{
Point P = setBezier(points[0], points[1], points[2], points[3], t);
setline(p_current, P);
p_current = P;
}
POINTSNUM = 0;
}
else {
POINTSNUM++;
}
}
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv); //固定格式
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //缓存模式
glutInitWindowSize(600, 480); //显示框的大小
glutInitWindowPosition(100, 100); //确定显示框左上角的位置
glutCreateWindow("第四次作业");
init(); // 初始化
glutMouseFunc(mymouseFunction); // 添加鼠标事件
glutDisplayFunc(display); // 执行显示
glutMainLoop(); //进人GLUT事件处理循环
return 0;
}
来源:https://blog.csdn.net/qq_28057541/article/details/51305292


猜你喜欢
- 开场白我本来是一名android开发者,突然就对java后端产生了浓烈的兴趣。所以,立马就转到了后端。第一个项目使用的使用Spring Da
- RocketMQ生产者发送消息分为三种模式RocketMQ生产者发送消息分为三种模式,分别是同步发送,异步发送和单向发送。单向发送,这个就是
- 1、概念首先我们理解一下,什么叫做完美数?问题描述:若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数
- 近来,很多公司的APP都实现了人脸识别登录的功能。今天呢,银鹏带大家从头到尾做一下这个人脸识别登录。首先呢,我们需要采用一个拥有人脸识别算法
- 解析和遍历一个HTML文档如何解析一个HTML文档:String html = "<html><head>
- 由C#转入Java一段时间了,总结下个人认为的Java同C#语法之间的不同之处,有不同意见之处还望各位海涵 刚学Java时觉得语法同C#大致
- 前言前面几篇文章已经为 Input 系统的分析打好了基础,现在是时候进行更深入的分析了。通常,手机是不带键盘的,但是手机上仍然有按键,就是我
- Android 工程构建的持续集成,需要搭建一套编译和打包自动化流程,比如建立每日构建系统、自动生成发布文件等等。这些都需要我们对Andro
- Set系列集合介绍Set集合概述Set系列集合特点:无序:存取数据的顺序是不一定的, 当数据存入后, 集合的顺序就固定下来了不重复:可以去除
- 文件输出为字符串示例代码:/** * 读取文件为字符串 * * @return */pub
- 使用过 mybatis 框架的小伙伴们都知道,mybatis 是个半 orm 框架,通过写 mapper 接口就能自动实现数据库的增删改查,
- 首先我们发现现在我们所用的android智能手机大部分都有当你在打电话时按power键来挂断电话,一般都是在设置中。 我主要是在原生源码中添
- 小编在之前给大家介绍过很多android项目打包的经验,本篇内容我们通过一个项目实例来给大家讲解android每一步打包和签名的过程。and
- 一、判断字母string str = Console.ReadLine();if (char.isLetter(str)){}else if
- 1.可能是缓存导致的。解决方法:清除缓存!2.全局编译可能项目依赖别的模块,别的模块修改未进行编译,这时须先对依赖模块进行编译补充知识:ID
- 本文实例为大家分享了android自定义圆形倒计时显示控件的具体代码,供大家参考,具体内容如下先上效果图 - 倒计时结束代码块at
- 本文实例讲述了C#实现的上传图片、保存图片、加水印、生成缩略图功能。分享给大家供大家参考,具体如下:伴随移动设备地普及,处理图片、视频等需求
- Android指定SnackBar在屏幕的位置Snackbar 常以一个小的弹出框的形式,出现在手机屏幕下方或者桌面左下方,并且是在屏幕所有
- 定义MD全称Message-Digest,即信息摘要,所以MD家族的算法也叫信息摘要算法MD家族有MD2、MD3、MD4、MD5,一代比一代
- 为什么写?今天去上班的公交上,有朋友在张队(张善友)的微信群里,发了一个介绍C# 6.0新特性的视频,视频7分钟,加上本人英语实在太low,