这里提供一个基于OpenGL和GLUT的简单程序,实现了画直线、画多边形、画圆、画字符、多边形填充、图形裁剪和图形的几何变换,并带有菜单界面,可以根据需要进行修改和扩展。
```c++
#include <GL/glut.h>
// 存储多边形顶点的数组
GLfloat vertices[][3] = { {-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},
{1.0,1.0,-1.0},{-1.0,1.0,-1.0},
{-1.0,-1.0,1.0},{1.0,-1.0,1.0},
{1.0,1.0,1.0},{-1.0,1.0,1.0} };
// 存储多边形的面的索引
GLint faces[][4] = { {0,1,2,3},{4,5,6,7},{0,4,5,1},
{1,5,6,2},{2,6,7,3},{3,7,4,0} };
// 定义菜单项的ID
enum MENU_ID {
MENU_LINE = 1,
MENU_POLYGON,
MENU_CIRCLE,
MENU_FILL,
MENU_CLIP,
MENU_TRANSLATE,
MENU_ROTATE,
MENU_SCALE,
MENU_EXIT
};
// 定义多边形的填充模式
enum POLYGON_MODE {
POLYGON_FILL,
POLYGON_LINE
};
// 当前多边形的填充模式
POLYGON_MODE polygon_mode = POLYGON_FILL;
// 定义图形的裁剪范围
GLfloat clip_xmin = -0.5, clip_xmax = 0.5,
clip_ymin = -0.5, clip_ymax = 0.5;
// 定义图形的平移、旋转和缩放参数
GLfloat translate_x = 0.0, translate_y = 0.0, translate_z = 0.0;
GLfloat rotate_x = 0.0, rotate_y = 0.0, rotate_z = 0.0;
GLfloat scale_x = 1.0, scale_y = 1.0, scale_z = 1.0;
// 绘制一个直线
void drawLine() {
glBegin(GL_LINES);
glVertex2f(-0.5, 0.0);
glVertex2f(0.5, 0.0);
glEnd();
}
// 绘制一个多边形
void drawPolygon() {
int i, j;
glBegin(GL_POLYGON);
for (i = 0; i < 6; i++) {
for (j = 0; j < 4; j++) {
glVertex3fv(vertices[faces[i][j]]);
}
}
glEnd();
}
// 绘制一个圆
void drawCircle() {
GLfloat radius = 0.5;
GLfloat angle;
int i;
glBegin(GL_POLYGON);
for (i = 0; i < 360; i++) {
angle = i * 3.1415926 / 180;
glVertex2f(radius*cos(angle), radius*sin(angle));
}
glEnd();
}
// 绘制一个字符
void drawText() {
char* str = "Hello, OpenGL!";
glRasterPos2f(-0.5, 0.0);
while (*str) {
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, *str++);
}
}
// 绘制一个填充的多边形
void drawFilledPolygon() {
int i, j;
glBegin(GL_POLYGON);
for (i = 0; i < 6; i++) {
for (j = 0; j < 4; j++) {
glVertex3fv(vertices[faces[i][j]]);
}
}
glEnd();
}
// 绘制一个线框多边形
void drawWireframePolygon() {
int i, j;
glBegin(GL_LINES);
for (i = 0; i < 6; i++) {
for (j = 0; j < 4; j++) {
glVertex3fv(vertices[faces[i][j]]);
glVertex3fv(vertices[faces[i][(j + 1) % 4]]);
}
}
glEnd();
}
// 绘制图形
void draw() {
glClear(GL_COLOR_BUFFER_BIT);
// 应用图形变换
glTranslatef(translate_x, translate_y, translate_z);
glRotatef(rotate_x, 1.0, 0.0, 0.0);
glRotatef(rotate_y, 0.0, 1.0, 0.0);
glRotatef(rotate_z, 0.0, 0.0, 1.0);
glScalef(scale_x, scale_y, scale_z);
// 绘制图形
switch (polygon_mode) {
case POLYGON_FILL:
drawFilledPolygon();
break;
case POLYGON_LINE:
drawWireframePolygon();
break;
}
glFlush();
}
// 处理菜单事件
void menu(int id) {
switch (id) {
case MENU_LINE:
glutDisplayFunc(drawLine);
break;
case MENU_POLYGON:
glutDisplayFunc(drawPolygon);
break;
case MENU_CIRCLE:
glutDisplayFunc(drawCircle);
break;
case MENU_FILL:
polygon_mode = POLYGON_FILL;
glutPostRedisplay();
break;
case MENU_CLIP:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(clip_xmin, clip_xmax, clip_ymin, clip_ymax);
glMatrixMode(GL_MODELVIEW);
glutPostRedisplay();
break;
case MENU_TRANSLATE:
translate_x += 0.1;
glutPostRedisplay();
break;
case MENU_ROTATE:
rotate_z += 10.0;
glutPostRedisplay();
break;
case MENU_SCALE:
scale_x *= 1.2;
scale_y *= 1.2;
glutPostRedisplay();
break;
case MENU_EXIT:
exit(0);
break;
}
}
// 初始化OpenGL
void init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
// 创建菜单
glutCreateMenu(menu);
glutAddMenuEntry("Draw Line", MENU_LINE);
glutAddMenuEntry("Draw Polygon", MENU_POLYGON);
glutAddMenuEntry("Draw Circle", MENU_CIRCLE);
glutAddMenuEntry("Fill Polygon", MENU_FILL);
glutAddMenuEntry("Clip Graphics", MENU_CLIP);
glutAddMenuEntry("Translate", MENU_TRANSLATE);
glutAddMenuEntry("Rotate", MENU_ROTATE);
glutAddMenuEntry("Scale", MENU_SCALE);
glutAddMenuEntry("Exit", MENU_EXIT);
glutAttachMenu(GLUT_RIGHT_BUTTON);
}
// 主函数
int main(int argc, char* argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(500, 500);
glutCreateWindow("OpenGL Example");
init();
glutDisplayFunc(draw);
glutMainLoop();
return 0;
}
```
在菜单中选择相应的功能可以进行直线、多边形、圆、填充、裁剪和变换等操作。可以根据需要进行修改和扩展。