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度,重置为0
		if (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算法绘制六边形,增加键盘交互实现改变图形颜色,增加鼠标交互实现按下鼠标左键图形旋转的功能。

相关推荐
:-)19 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
Jerry1 天前
LeetCode 101. 对称二叉树
算法
可编程芯片开发1 天前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星1 天前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮1 天前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
2501_914245931 天前
C语言与硬件交互:从GPIO到中断的嵌入式编程实践
c语言·单片机·交互
dream_home84071 天前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
大鱼>1 天前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
To_OC1 天前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC1 天前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode