OpenGL曲线绘制

qt+opengl绘制连续的曲线 简单的一个绘制连续曲线的demo,支持平移,滚轮缩放,没有刻度,不够平滑[可能需要自己写算法],调用这个类就可以,具体的业务需要自己去根据需要更改,比如设置曲线的颜色,设置曲线的x轴的点的个数,自己绘制xy轴的刻度。 阅读详情

通过菜单完成曲线即曲面的绘制:

  1. Hermite曲线(三次)
  2. Bezier曲线(三次或四次)
  3. B样条曲线(二次或三次)
  4. Bezier曲面(双三次)
  5. 退出

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<math.h>
#include<Windows.h>
#include <iostream>
#include <cmath>
#include<stdio.h> //X86
#include<GL/glut.h>
#define PI 3.1415926
int yourselect;
///#include<time.h>
using namespace std;
float ctrlpoints[4][4][3] = {
	{{-280,  0,400},{-200, 20,200} ,{100,180,350},{355,340,-20}},
	{{-280,-35,350},{-200, 40,150},{160,150,290},{375,310,-70}},
	{{-270,-45,120},{-190, 90,160}, {200,100,210},{395,250,-100}},
	{{-300,-200,50} ,{-180,150,170},{275,94,190},{380,220,-200}},

};
void Init() {
	//glClearColor(0.3f, 0.3f, 0.3f, 0.0f);  //灰色
	glClearColor(1.0f, 0.97f, 0.86f, 0.0f);
	glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,&ctrlpoints[0][0][0]);
	glEnable(GL_MAP2_VERTEX_3);
}
void Reshape(int w, int h) {     /////////
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	glOrtho(-w / 2, w / 2, -h / 2, h / 2, -800, 800);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}
//void circlefull(int xx, int yy,int zz, int r) {
//	int n = 1000;
//	glPointSize(3);
//	float st;
//	st = (2 * PI) / n;//角度转换为弧度
//	glBegin(GL_POINTS);
//	for (int i = 0; i <= r; i++) {
//		for (int j = 0; j < n; j++) {
//			glVertex3f(xx + i * cos(j * st), yy + i * sin(j * st),0);
//		}
//	}
//	glEnd();
//	glFlush();
//
//}
void circlenull(int xx, int yy, int zz, int r) {//不填充
	int n = 1000;
	glPointSize(3);
	float st;
	st = (2 * PI) / n;//角度转换为弧度
	glBegin(GL_LINES);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			glVertex3f(xx, yy, zz);
			glVertex3f(xx + r *sin(i*st)* cos(j * st), yy + r * sin(i * st)* sin(j * st), zz + r * cos(i* st));
		}
	}
	glEnd();
	glFlush();
}

void XY() {
	//gluLookAt(1, 1, 1, 0,0,0, 0, 1, 0);
	glLineWidth(1);
	//glColor3f(0.0, 0.0, 0.0);//坐标轴
	glColor3f(0.1, 0.1, 0.1);
	glBegin(GL_LINES);
	glVertex2i(-1000, 0);
	glVertex2i( 1000, 0);
	glVertex2i(0, -1000);
	glVertex2i(0,  1000);
	/*glVertex3i(0,0, -1000);
	glVertex3i(0,0, 1000);*/
	glEnd();
	glFlush();
}
void XYZ() {
	gluLookAt(-2,-2,2, 0,0,0, 0, 1, 0);
	glLineWidth(1);
	//glColor3f(0.0, 0.0, 0.0);//坐标轴
	glColor3f(0.1, 0.1, 0.1);
	glBegin(GL_LINES);
	glVertex3i(-1000, 0,0);
	glVertex3i(1000, 0,0);
	glVertex3i(0, -1000,0);
	glVertex3i(0, 1000,0);
	glVertex3i(0,0, -1000);
	glVertex3i(0,0, 1000);
	glEnd();
	glFlush();
}
int k = 1;
void Hermiteth(int *x,int *y) {

	//int z[4] = { 100,200,150,200 };

	int n = 20;
	double t, xx, yy, f0, f1, f2, f3;

	//glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.1, 0.1, 0.1);
	glBegin(GL_LINE_STRIP);
	for (int i = 0; i < 4; i++) {
		glVertex2i(x[i], y[i]);
		//glVertex3f(x[i], y[i],z[i]);
	}
	glEnd();
	glFlush();
	Sleep(1000);

	glLineWidth(3);
	glColor3f(1.0, 0.5, 0.3);
	glBegin(GL_LINE_STRIP);
	for (int i = 0; i < n; i++) {
		t = (float)i / n;
		f0 = 2 * pow(t, 3) - 3 * pow(t, 2) + 1;
		f1 = -2 * pow(t, 3) + 3 * pow(t, 2);
		f2 = pow(t, 3) - 2 * pow(t, 2) + t;
		f3 = pow(t, 3) - pow(t, 2);
		xx = x[1] * f0 + x[2] * f1 + (x[1] - x[0]) * f2 + (x[3] - x[2]) * f3;
		yy = y[1] * f0 + y[2] * f1 + (y[1] - y[0]) * f2 + (y[3] - y[2]) * f3;
		glVertex2d(xx, yy);
	}
	glEnd();
	glFlush();
}
void Bezierth(int* x,int *y) {
	
	int n = 20;
	double t, xx, yy;
	//glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.1, 0.1, 0.1);
	glBegin(GL_LINE_STRIP);
	for (int i = 0; i < 4; i++) {
		glVertex2f(x[i],y[i]);
	}
	glEnd();
	glFlush();
	Sleep(1000);

	glLineWidth(3);
	glColor3f(1.0, 0.0, 0.0);
	glBegin(GL_LINE_STRIP);
	for (int i = 0; i < n; i++) {
		t = (float)i / n;
		xx = x[0] * pow(1-t,3) + x[1] * pow(1-t,2) +3* x[2]*t*t*(1-t) + x[3]*pow(t,3);
		yy = y[0] * pow(1 - t, 3) + y[1] * pow(1 - t, 2) + 3 * y[2] * t * t * (1 - t) + y[3] * pow(t, 3);
		glVertex2d(xx, yy);
	}
	glEnd();
	glFlush();
}
void Bspline(int *xx,int * yy) {//B样条曲线 好用+++++++++++++++++
	int n = 10, m = 20;
	double t, x1, y1;
	glColor3f(0.1, 0.1, 0.1);
	glBegin(GL_LINE_STRIP);
	for (int i = 0; i < n; i++) {
		glVertex2f(xx[i],yy[i]);
	}
	glEnd();
	glFlush();
	Sleep(200);
	glLineWidth(3);
	glColor3f(1.0, 0.0, 0.0);
	glBegin(GL_LINE_STRIP); 
	for (int i = 0; i < n-2; i++) {
		for (int j = 0; j < m; j++) {
			t = (float)j / m;
			x1 = 0.5 * (xx[i] * pow((1 - t), 2) + xx[i + 1] * (1 + 2 * t - 2 * t * t) + xx[i + 2] * t * t);
			y1 = 0.5 * (yy[i] * pow((1 - t), 2) + yy[i + 1] * (1 + 2 * t - 2 * t * t) + yy[i + 2] * t * t);
			glVertex2d(x1, y1);
		}
	}
	glEnd();
	glFlush();
}
void Bezierogee() { //Bezier曲面++++++++++++++++++++++++++++++++++++
	glColor3f(1.0, 0.0, 0.0);
	glRotatef(85, 1.0, 1.0, 1.0);
	glPushMatrix();//当前矩阵会被复制一份并压入栈中。这样,在之后的操作中,可以使用栈顶的矩阵进行变换,而不会影响之前的变换
	for (int i = 0; i < 20; i++) {
		glBegin(GL_LINE_LOOP);
		for (int j = 0; j < 20; j++) {
			glEvalCoord2f(j / 20.0, i /20.0);
		}
		glEnd();

		glBegin(GL_LINE_LOOP);
		for (int j = 0; j < 20; j++) {
			glEvalCoord2f(j / 20.0, i / 20.0);
		}
		glEnd();
	}
	glPopMatrix();
	glFlush();
	glDisable(GL_MAP2_VERTEX_3);
}
void improve(int* xx, int* yy) {//B样条guiji
	int n = 10, m = 20;
	double t, x1, y1;
	gluLookAt(0, 0, 2, 0, 0, 0, 0, 1, 0);
	//glBegin(GL_LINE_STRIP);
	//for (int i = 0; i < n; i++) {
	//	glVertex2f(xx[i], yy[i]);
	//}
	//glEnd();
	//glFlush();
	////Sleep(10);
	//glLineWidth(3);
	/*glBegin(GL_LINE_STRIP);*/
	for (int i = 0; i < n - 2; i++) {
		for (int j = 0; j < m; j++) {
			t = (float)j / m;
			
			x1 = 0.5 * (xx[i] * pow((1 - t), 2) + xx[i + 1] * (1 + 2 * t - 2 * t * t) + xx[i + 2] * t * t);
			y1 = 0.5 * (yy[i] * pow((1 - t), 2) + yy[i + 1] * (1 + 2 * t - 2 * t * t) + yy[i + 2] * t * t);\
				//if (i % 2 == 0) {
					glColor3f(1.0, 0.0, 0.0);
				//}
				circlenull(50, x1, y1,-20);
				//else {
					glColor3f(0.1, 0.1, 0.1);
				//}
			    circlenull(50, x1, y1,-20);
			
		}
	}
	
}
void myDisplay() { /////////////////

	glLoadIdentity();
	XY();
	/*glBegin(GL_POLYGON); 
	glColor3f(1.0, 0.2, 0.2);
	glVertex2f(360, 380);
	glVertex2f(400, 380);
	glVertex2f(400, 400);
	glVertex2f(360, 400);
	glEnd();
	glFlush();*/

	glLineWidth(2);
	int x1[4] = { -350,-200,200,350 };
	int y1[4] = { 200,50,50,200 };

	int x2[4] = { -140,-110,-100,  0 };
	int y2[4] = { 140,-90,-150,-170 };

	int x3[10] = { -350,-300,-150, -70, 50, 25, 175, 220, 250,370 };
	int y3[10] = { -150,-250, -80, 380,350,280, 180,-250,-350,150 };
	if (yourselect == 1) {
		glColor3f(1.0, 0.5, 0.4);
		Hermiteth(x1,y1);
		//glFlush();
	}
	else if (yourselect == 2) {
		glColor3f(0.0, 0.5, 0.4);
		Bezierth(x2,y2);
	}
	else if (yourselect == 3) {
		//glLoadIdentity();
		//glColor3f(1.0, 0.5, 0.4);
		Bspline(x3,y3);
	//	//glTranslatef(50*k, 0, 0);//平移
	//	//glutWireSphere(100, 16, 16);
	}
	else if (yourselect == 4) {
		//glColor3f(1.0, 0.5, 0.4);
		XYZ();
		glColor3f(0.1, 0.1, 0.1);
		Bezierogee();
	/*	glScalef(1.5*k, 1.5*k, 1.5*k);
		glutWireSphere(100, 16, 16);*/
	}
	else if (yourselect == 5) {
		glColor3f(1.0, 0.5, 0.4);
		XYZ();
		improve(x3,y3);
		
	}
	else if(yourselect == 6) {
		exit('End');
		
	}
	
	glFlush();
	k++;
}

void menu(int menultem) {
	yourselect = menultem;
	glutPostRedisplay();
}
	int main(int argc, char* argv[])
	{
		glutInit(&argc, argv);
		glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
		glutInitWindowPosition(100, 100);
		glutInitWindowSize(800, 800);
		glutCreateWindow("the forth plus menu");

		int menuld = glutCreateMenu(menu);
		glutAddMenuEntry("Hermiteth", 1);
		glutAddMenuEntry("Bezierth", 2);
		glutAddMenuEntry("Bspline", 3);
		glutAddMenuEntry("Bezierogee", 4);
		glutAddMenuEntry("improve", 5);
		glutAddMenuEntry("End", 6);
		glutAttachMenu(GLUT_RIGHT_BUTTON);

		Init();
		glutReshapeFunc(Reshape);
		glutDisplayFunc(myDisplay);
		//glutMouseFunc(mouse_hit);
		glutMainLoop();
		return 0;
	}

OpenGL数据可视化(5)绘制三维曲面 介绍了如何使用OpenGL绘制三维曲面,实现类似MATLAB中surface函数的效果,涉及GL_TRIANGLE_STRIP三角条带、GL_PRIMITIVE_RESTART图元重启等。 阅读详情

相关推荐

基于VC++的OpenGL编程讲座之曲线和曲面

天极软件专题专区精选     到天极软件“读编交流区”畅所欲言Google专区 POPO专区QQ专区 QQ挂机了解Web2.0Flash MX 视频教程Photoshop视频教程网页设计视频教程照片处理数字暗房PPT动画演示教程Excel动画教程集Word动画演示教程Windows Vista专区 特洛伊木马专区黑客知识教程专区防火墙应用专区注册表应用专区Windows API开发专区网络编程专区

ark1111的专栏 2825

OpenGL曲线、曲面矢量绘制

1:用四个控制点绘制一条三次Bezier曲线 Github地址 #include "stdafx.h" #include <stdlib.h> #include <time.h> #include <GL/glut.h> //4个控制点的3D坐标——z坐标全为0 GLfloat ctrlpoints[4][3] = { { -4, -4, 0 }...

asiya的博客 3695

OpenGL绘制Bezier曲线

 项目要求: – 使用鼠标在屏幕中任意设置控制点,并生成曲线 – 使用鼠标和键盘的交互操作实现对曲线的修改。 项目总体介绍 本项目利用Bezier曲线生成算法生成可由用户自定义的曲线。可实现核心功能如下: 用户用鼠标左击屏幕任意处产生记录点。 鼠标右击屏幕任意处由先前的任意个数记录点和其先后关系生成Bezier曲线。 另有辅助

张竞成的博客 1万+

用OpenGL进行曲线、曲面的绘制

用OpenGL进行曲线、曲面的绘制 阅读目录实验目的代码1:用四个控制点绘制一条三次Bezier曲线代码2:用4*4个控制点绘制一个三次Bezier曲面线框模型代码3:用4*4个控制点绘制一个三次Bezier曲面并添加光照效果说明代码4:用4*4个控制点绘制一个NURBS曲面并添加光照效果写在最后 回到顶部实验目的 理解Bezier曲线、曲面绘制的基本原理;理解OpenGL中一维、二维插值求值器的用法。 掌握OpenGL中曲线、曲面绘图

hbspring007的专栏 2792

OPENGL绘制贝塞尔曲线

最终效果图:通过3个点形成一条贝塞尔曲线1. 鼠标问题在使用鼠标获取坐标的时候,要知道鼠标获取的坐标和屏幕坐标是不同的; openGL使用右手坐标 从左到右,x递增 从下到上,y递增 从远到近,z递增 而鼠标是从左到右增x,同时从上到下也是增y所以在求 y 的时候,用(屏幕大小-y)来获取2. 绘制setpoint 用来绘制点 setline 用来绘制线 setBezier

薛昭君的博客 1万+

Android调用OpenGL绘制曲线入门手册

 Android调用OpenGL绘制曲线入门手册  Android  OpenGL ES2.0 JNI  Cmake简介:该手册内容仅作为Android调用OpenGL实现绘制曲线图的入门手册,深入学习请参考手册推荐书籍。本手册针对采用jni接口实现java调用C++代码完成OpenGL在Android中的曲线绘制做了详细流程介绍,最终实现效果为在Android平台绘制正弦曲线。 撰写人:武斌(1...

菜鸟博客 3793

OpenGL:绘制B样条曲线

绘制B样条曲线: #include #include // #if 0 /// the points of the curve - these are the same as the bezier curve /// points demonstrated in the bezier curve example. float Points[4][3] = {

小熊不去实验室 1万+

OpenGL 绘制B样条曲线

OpenGL 绘制B样条曲线

ytffhew的博客 2921

OpenGL 实践之贝塞尔曲线绘制

说到贝塞尔曲线,大家肯定都不陌生,网上有很多关于介绍和理解贝塞尔曲线的优秀文章和动态图。以下两个是比较经典的动图了。二阶贝塞尔曲线:三阶贝塞尔曲线:由于在工作中经常要和贝塞尔曲线打交道,...

Jerish的博客 4713

OpenGL绘制三维贝塞尔曲线

实现一个三维的贝塞尔曲线绘制程序。

qa1041335855的博客 7761

【计算机图形学】c++ openGL 绘制贝塞尔曲线

利用c++语言以及openGL库 完成贝塞尔曲线绘制 源代码 #include "stdafx.h" #include "GL/glut.h" #include <GL/gl.h> #include <math.h> #include <Windows.h> //这是一个点的类,用于存储其中点的坐标 class Point { public: int x, y; void setxy(int _x, int _y) { x = _x; y = _y; }

Arana的博客 3456

OpenGL - 三次Bezier曲线的绘制

计算公式: 运行结果: 代码如下:#include<gl/glut.h> #include<math.h> #include<windows.h> #include<vector> #include<algorithm> using namespace std; struct Point { int x, y; Point(){}; Point(int tx, int t

wyg1997 6832

OpenGL ES 绘制贝塞尔曲线

该原创文章首发于微信公众号:字节流动 最近要求为图像设计流线型曲线边框,想着可以用 OpenGL 绘制贝塞尔曲线,再加上模板测试来实现,趁机尝试一波。 什么是贝塞尔曲线 贝塞尔曲线于 1962 年,由法国工程师皮埃尔·贝济埃(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计,可以设计出曲线形车身。 贝塞尔曲线主要用于二维图形应用程序中的数学曲线,曲线主要由起始...

字节流动 5099

android 贝塞尔曲线_OpenGL 实践之贝塞尔曲线绘制

说到贝塞尔曲线,大家肯定都不陌生,网上有很多关于介绍和理解贝塞尔曲线的优秀文章和动态图。以下两个是比较经典的动图了。二阶贝塞尔曲线:三阶贝塞尔曲线:由于在工作中经常要和贝塞尔曲线打交道,所以简单说一下自己的理解:现在假设我们要在坐标系中绘制一条直线,直线的方程很简单,就是 y=x ,很容易得到下图:现在我们限制一下 x 的取值范围为 0~1 的闭区间,那么可以得出 y 的取值范围也是 0...

weixin_28747937的博客 497

荔枝派Lichee Nano全志F1C100s烧录避坑指南:从Fel模式到SPI Flash完整流程

本文详细介绍了荔枝派Lichee Nano基于全志F1C100s芯片的SPI Flash烧录完整流程,从FEL模式进入技巧到定制化sunxi-tools编译,再到分区策略与实战烧录步骤。针对开发者常见的烧录程序问题提供了专业解决方案,帮助用户高效完成嵌入式系统部署。

tea88的博客 787

拯救者R7000用户实测:用华为电脑管家11.0版搞定MatePad Pro多屏协同(附驱动与显卡避坑指南)

本文详细介绍了如何在非华为笔记本联想拯救者R7000上安装华为电脑管家11.0版,实现与MatePad Pro的多屏协同功能。从驱动优化到显卡配置,提供了全面的避坑指南和实用技巧,帮助用户解决连接失败等常见问题,提升跨设备生产力体验。

weixin_30788619的博客 398
上一篇: OpenGL三视图
下一篇: OpenGL图像纹理和和函数纹理
fqq3
博客等级 码龄4年 114粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值