如何通过GLUT实现键盘按键加减调整绘制多边形的边数
功能实现方案
你当前的代码已经完成了按键监听的逻辑,只需要补全正多边形顶点计算、绘制模式修正、基础变量定义三个部分即可,完整修改如下:
1. 前置补充定义
首先在代码开头添加必要头文件和全局变量:
#include <GL/glut.h> #include <math.h> #include <stdlib.h> // 全局变量:多边形边数,初始为3(三角形) int n = 3; // 正多边形的外接圆半径,适配默认正交投影的[-1,1]坐标范围 const float shape_radius = 0.5f; // 圆周率常量 const float PI = 3.1415926f;
2. 修改绘制函数逻辑
你当前的绘制函数用了GL_POINTS只会绘制散点,需要修改绘制模式,同时补全顶点计算逻辑:
static void DisplayShape(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3d(1,0.1,0.6); // 填充多边形用GL_POLYGON,线框多边形换为GL_LINE_LOOP glBegin(GL_POLYGON); for(int i=0;i<n;++i) { // 计算当前顶点的极角 float angle = 2 * PI * i / n; // 极坐标转笛卡尔坐标,中心默认在窗口中心(0,0) float x = shape_radius * cos(angle); float y = shape_radius * sin(angle); glVertex2f(x, y); } glEnd(); glutSwapBuffers(); }
3. 可选优化(解决图形拉伸问题)
默认投影下窗口拉伸会导致图形变形,可以在main函数的glutCreateWindow之后添加正交投影配置:
glutCreateWindow("GLUT Shapes"); // 新增正交投影配置 glMatrixMode(GL_PROJECTION); glLoadIdentity(); // 配置正方形正交区域,避免窗口拉伸导致图形变形 glOrtho(-1, 1, -1, 1, -1, 1); glMatrixMode(GL_MODELVIEW);
其他说明
- 你原来的
idle函数可以删除,按键逻辑里已经调用了glutPostRedisplay(),不需要每帧强制重绘浪费性能,删除后记得去掉glutIdleFunc(idle);这行注册代码即可 - 按下
+边数增加,当边数超过100后视觉上就是圆形效果 - 按下
-边数最小为3,保证始终是多边形
内容的提问来源于stack exchange,提问作者Eikichi Onizuka
相关产品推荐
相关产品推荐

