欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > OpenGL利用DDA算法绘制图形,并增加鼠标键盘交互

OpenGL利用DDA算法绘制图形,并增加鼠标键盘交互

2025/5/8 7:35:54 来源:https://blog.csdn.net/y0205yang/article/details/145029016  浏览:    关键词:OpenGL利用DDA算法绘制图形,并增加鼠标键盘交互
#include <GL/glut.h>
#include <math.h>// 定义角度常数
const float PI = 3.14159265358979323846f;
const int RADIUS = 100; // 六边形外接圆的半径// 当前颜色
float currentColor[3] = { 0.0f, 0.0f, 0.0f }; // 初始颜色为黑色// 当前旋转角度
float rotationAngle = 0.0f;// 计算六个顶点的坐标
void calculateHexagonVertices(float centerX, float centerY, float radius, float vertices[6][2]) {for (int i = 0; i < 6; i++) {float angle = (i * 60) * PI / 180;  // 每个顶点之间的角度为60°vertices[i][0] = centerX + radius * cos(angle);vertices[i][1] = centerY + radius * sin(angle);}
}// 使用DDA算法绘制一条线
void ddaLine(float x1, float y1, float x2, float y2) {float dx = x2 - x1;float dy = y2 - y1;float steps = (fabs(dx) > fabs(dy)) ? fabs(dx) : fabs(dy);  // 计算步数float xIncrement = dx / steps;float yIncrement = dy / steps;float x = x1;float y = y1;glBegin(GL_POINTS);for (int i = 0; i <= steps; i++) {glVertex2i(round(x), round(y));  // 绘制点x += xIncrement;y += yIncrement;}glEnd();
}// 绘制六芒星
void drawHexagram(float centerX, float centerY, float radius) {// 计算六个顶点float vertices[6][2];calculateHexagonVertices(centerX, centerY, radius, vertices);// 保存当前矩阵glPushMatrix();// 平移坐标系,将六芒星的中心移动到原点glTranslatef(centerX, centerY, 0.0f);// 旋转六芒星glRotatef(rotationAngle, 0.0f, 0.0f, 1.0f);// 再次平移坐标系,将六芒星恢复到原来位置glTranslatef(-centerX, -centerY, 0.0f);// 绘制六边形的外框for (int i = 0; i < 6; i++) {ddaLine(vertices[i][0], vertices[i][1], vertices[(i + 1) % 6][0], vertices[(i + 1) % 6][1]);}// 绘制六芒星的内部对角线ddaLine(vertices[0][0], vertices[0][1], vertices[3][0], vertices[3][1]);ddaLine(vertices[1][0], vertices[1][1], vertices[4][0], vertices[4][1]);ddaLine(vertices[2][0], vertices[2][1], vertices[5][0], vertices[5][1]);// 恢复矩阵glPopMatrix();
}// OpenGL初始化设置
void init() {glClearColor(1.0, 1.0, 1.0, 1.0); // 背景色为白色glColor3f(currentColor[0], currentColor[1], currentColor[2]); // 使用初始颜色(黑色)glPointSize(1.0); // 点的大小glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, 500.0, 0.0, 500.0); // 设置坐标系
}// 渲染函数
void display() {glClear(GL_COLOR_BUFFER_BIT);// 绘制六芒星drawHexagram(250, 250, RADIUS);glFlush();
}// 键盘事件处理函数
void keyboard(unsigned char key, int x, int y) {if (key == 'r' || key == 'R') {// 红色currentColor[0] = 1.0f;currentColor[1] = 0.0f;currentColor[2] = 0.0f;}else if (key == 'g' || key == 'G') {// 绿色currentColor[0] = 0.0f;currentColor[1] = 1.0f;currentColor[2] = 0.0f;}else if (key == 'b' || key == 'B') {// 黄色currentColor[0] = 1.0f;currentColor[1] = 1.0f;currentColor[2] = 0.0f;}// 更新颜色glColor3f(currentColor[0], currentColor[1], currentColor[2]);// 重新绘制glutPostRedisplay();
}// 鼠标事件处理函数
void mouse(int button, int state, int x, int y) {if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {// 左键点击时增加旋转角度rotationAngle += 15.0f; // 每次点击增加15度// 如果角度超过360度,重置为0if (rotationAngle >= 360.0f) {rotationAngle -= 360.0f;}// 重新绘制glutPostRedisplay();}
}// 主函数
int main(int argc, char **argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(500, 500);glutCreateWindow("DDA绘制六芒星");init();// 注册事件处理函数glutKeyboardFunc(keyboard);glutMouseFunc(mouse);  // 注册鼠标事件处理函数glutDisplayFunc(display);glutMainLoop();return 0;
}

利用DDA算法绘制六边形,增加键盘交互实现改变图形颜色,增加鼠标交互实现按下鼠标左键图形旋转的功能。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词