目录
点
常用函数
函数 | 解释 |
---|---|
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循环里面,读者可以运行一下代码,会进行轮播,第二轮开始后线就成为了虚线,若想是实线该用什么函数,何时调用呢?由读者思考吧。时间关系,就截了几张图,有疑问请下方评论。
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。