OpenGL交互式画圆算法示例代码
下面是使用OpenGL编写的具有用户交互的画圆算法的示例代码。用户可以点击鼠标左键来确定圆的中心,然后拖动鼠标并松开左键来确定圆的半径。
#include <GL/glut.h>
#include <iostream>
// 圆参数
float centerX = 0.0f;
float centerY = 0.0f;
float radius = 0.0f;
bool isDrawing = false;
// 用于绘制圆
void drawCircle() {
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
if (radius > 0.0f) {
glBegin(GL_LINE_LOOP);
for (int i = 0; i < 360; i++) {
float rad = i * 3.14159f / 180.0f;
float x = centerX + radius * cos(rad);
float y = centerY + radius * sin(rad);
glVertex2f(x, y);
}
glEnd();
}
glFlush();
}
// 鼠标点击回调函数
void mouse(int button, int state, int x, int y) {
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
centerX = (x - glutGet(GLUT_WINDOW_WIDTH) / 2) / (float)glutGet(GLUT_WINDOW_WIDTH) * 2.0f;
centerY = -(y - glutGet(GLUT_WINDOW_HEIGHT) / 2) / (float)glutGet(GLUT_WINDOW_HEIGHT) * 2.0f;
isDrawing = true;
}
else if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
float endX = (x - glutGet(GLUT_WINDOW_WIDTH) / 2) / (float)glutGet(GLUT_WINDOW_WIDTH) * 2.0f;
float endY = -(y - glutGet(GLUT_WINDOW_HEIGHT) / 2) / (float)glutGet(GLUT_WINDOW_HEIGHT) * 2.0f;
radius = sqrt(pow(endX - centerX, 2) + pow(endY - centerY, 2));
isDrawing = false;
}
glutPostRedisplay();
}
// 鼠标拖动回调函数
void motion(int x, int y) {
if (isDrawing) {
float endX = (x - glutGet(GLUT_WINDOW_WIDTH) / 2) / (float)glutGet(GLUT_WINDOW_WIDTH) * 2.0f;
float endY = -(y - glutGet(GLUT_WINDOW_HEIGHT) / 2) / (float)glutGet(GLUT_WINDOW_HEIGHT) * 2.0f;
radius = sqrt(pow(endX - centerX, 2) + pow(endY - centerY, 2));
}
glutPostRedisplay();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutCreateWindow('Interactive Circle');
glClearColor(0.0, 0.0, 0.0, 1.0);
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
glutDisplayFunc(drawCircle);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
return 0;
}
此代码使用OpenGL库实现了一个具有用户交互的画圆算法。用户可以点击鼠标左键来确定圆的中心,然后拖动鼠标并松开左键来确定圆的半径。圆的位置和半径的改变会即时更新在屏幕上。
请注意,此代码仅为演示目的,并未进行错误处理或优化。您可以根据自己的需求进行修改和扩展。希望对您有所帮助!
原文地址: https://www.cveoy.top/t/topic/bzxc 著作权归作者所有。请勿转载和采集!