OpenGL-基本图元(包括点、线、圆形等)

时间:2024-03-19 16:53:52

目录

常用函数

代码

线

常用函数

代码

代码

五角星

代码

正弦函数图像

代码

所有代码

部分截图


常用函数

点的常用函数
函数 解释
void glPointSize(GLfloat size) 控制点的大小
glVertex2f(GLfloat x, GLfloat y) 点的坐标

点的大小默认为1个像素,但也可以改变之。

size必须大于0.0f,默认值为1.0f,单位为“像素”。

注意:对于具体的OpenGL实现,点的大小都有限度,如果设置的size超过最大值,则设置可能会有问题。

代码

//画点
void myPoint(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glPointSize(5.0f);//点的大小
	glBegin(GL_POINTS);
	glVertex2f(0.0f, 0.0f);
	//glVertex2f(0.5f, 0.5f);
	glEnd();
	glFlush();
}

线

常用函数

线的常用函数
函数 解释
glEnable(GL_LINE_STIPPLE) 开启虚线模式
glDisable(GL_LINE_STIPPLE) 关闭虚线模式
void glLineStipple(GLint factor, GLushort pattern) 设置虚线样式
void glLineWidth(GLfloat width) 设置线的宽度

线绘制时有三种方式:

GL_LINES:是指每两个点构成一条独立的线

GL_LINE_STRIP:每一个点都跟前一个顶点构成一条直线,是连续的线

GL_LINE_LOOP:跟GL_LINE_STRIP相同,并且线首尾相接,形成封闭连续线

代码

//画线
void myLine()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glEnable(GL_LINE_STIPPLE);//启动虚线模式
	//glDisable(GL_LINE_STIPPLE);//关闭虚线模式
	glLineStipple(2, 0x0F0F); //0000111100001111
	glLineWidth(10.0f);
	glBegin(GL_LINES);
	glVertex2f(0.0f, 0.0f);
	glVertex2f(0.5f, 0.5f);
	glEnd();
	glFlush();
}

画圆的方式有很多种,这里介绍的方式效率并不高。当正多边形的边数很大时,肉眼就无法分辨,认为是光滑的,这里画的是正n边形,读者可以改变n的大小来看。

代码

//画圆
void myCircle(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POLYGON); //画正n边形
	for (int i = 0; i<n; ++i)
		glVertex2f(R*cos(2 * Pi / n*i), R*sin(2 * Pi / n*i));
	glEnd();
	glFlush();
}

五角星

画五角星就是画5个点,模拟手画的顺序。

代码

void myStar(void)
{
	GLfloat a = 1 / (2 - 2 * cos(72 * Pi / 180));
	GLfloat bx = a * cos(18 * Pi / 180);
	GLfloat by = a * sin(18 * Pi / 180);
	GLfloat cy = -a * cos(18 * Pi / 180);
	GLfloat
		PointA[2] = { 0, a },
		PointB[2] = { bx, by },
		PointC[2] = { 0.5, cy },
		PointD[2] = { -0.5, cy },
		PointE[2] = { -bx, by };
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_LINE_LOOP);
	glVertex2fv(PointA);
	glVertex2fv(PointC);
	glVertex2fv(PointE);
	glVertex2fv(PointB);
	glVertex2fv(PointD);
	glEnd();
	glFlush();
}

正弦函数图像

画x轴与y轴就是两点成一线,正弦函数图像当然要利用正弦函数。

代码

//画正弦函数图像
void mySin()
{
	GLfloat x;
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_LINES);
	glVertex2f(-1.0f, 0.0f);// 画x轴
	glVertex2f(1.0f, 0.0f);         
	glVertex2f(0.0f, -1.0f);// 画y轴
	glVertex2f(0.0f, 1.0f);         
	glEnd();
	glBegin(GL_LINE_STRIP);
	for (x = -1.0f / factor; x<1.0f / factor; x += 0.01f)
	{
		glVertex2f(x*factor, sin(x)*factor);
	}
	glEnd();
	glFlush();
}

所有代码

#include<GL\glut.h>
#include <math.h>
#include <windows.h>
#include<iostream>
using namespace std;
const int n = 50;
const GLfloat factor = 0.1f;
const GLfloat R = 0.5f;
const GLfloat Pi = acos(-1); //3.14159
//画点
void myPoint(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glPointSize(5.0f);//点的大小
	glBegin(GL_POINTS);
	glVertex2f(0.0f, 0.0f);
	//glVertex2f(0.5f, 0.5f);
	glEnd();
	glFlush();
}
//画线
void myLine()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glEnable(GL_LINE_STIPPLE);//启动虚线模式
	//glDisable(GL_LINE_STIPPLE);//关闭虚线模式
	glLineStipple(2, 0x0F0F); //0000111100001111
	glLineWidth(10.0f);
	glBegin(GL_LINES);
	glVertex2f(0.0f, 0.0f);
	glVertex2f(0.5f, 0.5f);
	glEnd();
	glFlush();
}
//画圆
void myCircle(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POLYGON); //画正n边形
	for (int i = 0; i<n; ++i)
		glVertex2f(R*cos(2 * Pi / n*i), R*sin(2 * Pi / n*i));
	glEnd();
	glFlush();
}
//画五角星
void myStar(void)
{
	GLfloat a = 1 / (2 - 2 * cos(72 * Pi / 180));
	GLfloat bx = a * cos(18 * Pi / 180);
	GLfloat by = a * sin(18 * Pi / 180);
	GLfloat cy = -a * cos(18 * Pi / 180);
	GLfloat
		PointA[2] = { 0, a },
		PointB[2] = { bx, by },
		PointC[2] = { 0.5, cy },
		PointD[2] = { -0.5, cy },
		PointE[2] = { -bx, by };
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_LINE_LOOP);
	glVertex2fv(PointA);
	glVertex2fv(PointC);
	glVertex2fv(PointE);
	glVertex2fv(PointB);
	glVertex2fv(PointD);
	glEnd();
	glFlush();
}
//画正弦函数图像
void mySin()
{
	GLfloat x;
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_LINES);
	glVertex2f(-1.0f, 0.0f);// 画x轴
	glVertex2f(1.0f, 0.0f);         
	glVertex2f(0.0f, -1.0f);// 画y轴
	glVertex2f(0.0f, 1.0f);         
	glEnd();
	glBegin(GL_LINE_STRIP);
	for (x = -1.0f / factor; x<1.0f / factor; x += 0.01f)
	{
		glVertex2f(x*factor, sin(x)*factor);
	}
	glEnd();
	glFlush();
}
//展示图形
void myDisplay(void)
{
	int i;
	glClear(GL_COLOR_BUFFER_BIT);
	for (int k = 0;k < 5;k++)
	{
		switch (k)
		{
		case 0: {
			myPoint();
		}break;
		case 1: {
			myCircle();
		}break;
		case 2:
		{
			myStar();
		}break;
		case 3:
		{
			mySin();
		}break;
		case 4:
		{
			myLine();
		}break;
		default:
			break;
		}
		Sleep(700);
		if (4 == k)k = 0;//循环回去
	}
}
//主函数
int main(int argc, char *argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(600, 600);
	glutCreateWindow("基本图元");
	glutDisplayFunc(&myDisplay);
	glutMainLoop();
	return 0;
}

部分截图

博主将所有图形写在了一个for循环里面,读者可以运行一下代码,会进行轮播,第二轮开始后线就成为了虚线,若想是实线该用什么函数,何时调用呢?由读者思考吧。时间关系,就截了几张图,有疑问请下方评论。

OpenGL-基本图元(包括点、线、圆形等)
圆形
OpenGL-基本图元(包括点、线、圆形等)
五角星
OpenGL-基本图元(包括点、线、圆形等)
第二轮后的正弦图像

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。