其他计算机图形学实验见 链接
#include<iostream>
#include<GL/glut.h>
using namespace std;
float bx, by, ex, ey, r;
int window_width = 1000, window_height = 800;
void MidPointCircle(int x0, int y0, int r);
void display();
void drag_mouse(int x, int y);
void listen_mouse(int button, int state, int x, int y);
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(window_width, window_height);
glutCreateWindow("中点画圆算法");
glClearColor(1, 1, 1, 1);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, window_width, window_height, 0);
glPointSize(3.0f);
glColor3f(10, -10, -10);
glutDisplayFunc(&display);
glutMouseFunc(listen_mouse);
glutMotionFunc(drag_mouse);
glutMainLoop();
return 0;
}
void MidPointCircle(int x0, int y0, int r)
{
glClear(GL_COLOR_BUFFER_BIT);
int x = 0;
int y = r;
double d = 1.25 - r;
glBegin(GL_POINTS);
glVertex2f(x0, y0);
glVertex2f(x + x0, y + y0);
glEnd();
while (x <= y)
{
if (d < 0)
d += 2 * x + 3;
else
{
d += 2 * (x - y) + 5;
y--;
}
x++;
glBegin(GL_POINTS);
glVertex2f(x + x0, y + y0);
glVertex2f(y + x0, x + y0);
glVertex2f(-x + x0, y + y0);
glVertex2f(y + x0, -x + y0);
glVertex2f(x + x0, -y + y0);
glVertex2f(-y + x0, x + y0);
glVertex2f(-x + x0, -y + y0);
glVertex2f(-y + x0, -x + y0);
glEnd();
}
glFlush();
}
void display()
{
MidPointCircle(bx, by, r);
}
void drag_mouse(int x, int y)
{
ex = x;
ey = y;
printf("待定坐标:起点(%d, %d) 终点(%d, %d)\n", bx, by, ex, ey);
r = sqrt((bx - ex) * (bx - ex) + (by - ey) * (by - ey));
MidPointCircle(bx, by, r);
glFlush();
}
void listen_mouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON && state == GLUT_UP)
{
ex = x;
ey = y;
printf("最终坐标:起点(%d, %d) 终点(%d, %d)\n", bx, by, ex, ey);
r = sqrt((bx - ex) * (bx - ex) + (by - ey) * (by - ey));
printf("圆半径为:%d\n", r);
MidPointCircle(bx, by, r);
glFlush();
}
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
bx = x;
by = y;
}
}