#include <GL/glut.h>
void Choice(int x,int y,int l,int w,int type)
{//根据条件画圆,
switch(type)
{
case 1://上半圆
{
glVertex2f(x+l, y+w);
glVertex2f(-x+l,y+w);
}
break;
case 2://下半圆
{
glVertex2f(x+l,-y+w);
glVertex2f(-x+l,-y+w);
}
break;
case 3://整个圆
{
glVertex2f(x+l, y+w);
glVertex2f(-x+l,y+w);
glVertex2f(x+l,-y+w);
glVertex2f(-x+l,-y+w);
}
break;
default: break;
}
}
void MyDisplay(int xx,int r,float R,float G,float B,int length,int width,int TYPE)
{//根据起点坐标,半径,R,G,B,圆的位置,类型来画圆
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(R,G,B);
int yy = r,d = 1-r;//设置半径,纵坐标,变化量
glBegin(GL_LINES);
while(xx <= yy)
{
if(d < 0)//点在圆内
{
d+= 2*xx + 3;
}
else //点在圆外
{
d+= 2*(xx-yy) + 5;
yy = yy - 1;
}
xx = xx + 1; //确定下一个象素的点
Choice(xx,yy,length,width,TYPE);//画圆
}
while(yy >= 0) //x=y对称的八分圆
{
if( d > 0)
{
d-= 2*yy + 3;
}
else
{
d+= 2*(xx-yy) + 5;
xx = xx + 1;
}
yy = yy - 1;
Choice(xx,yy,length,width,TYPE);
}
glFlush();
}
void myDisplay1(void)//画整个圆的框架
{
glClear(GL_COLOR_BUFFER_BIT); //刷新窗口缓冲区
glColor3f(0.0,0.0,0.0);
int r = 100,xx = 0,yy = r,d = 1-r;
//glBegin(GL_POINTS);
while( xx <= yy)
{
if(d<0)
{
d+= 2*xx + 3;
}
else
{
d+= 2*(xx-yy) + 5;
yy = yy-1;
}
xx = xx + 1;
glBegin(GL_POINTS);
Choice(xx,yy,400,300,3);//画出圆
glEnd();
}
while(yy >= 0)
{
if(d > 0)
d-= 2*yy + 3;
else
{
d+= 2*(xx-yy) + 5;
xx = xx + 1;
}
yy = yy - 1;
glBegin(GL_POINTS);
Choice(xx,yy,400,300,3);//画出x=y的对称圆
glEnd();
}
glFlush();
}
void init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
}
void Reshape(GLsizei w,GLsizei h)
{
glViewport(0,0,w,h);
glLoadIdentity();
gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);
}
void myDisplay(void)
{
MyDisplay(0,100,0.0,0.0,0.0,400,300,1);//上半个大黑圆
MyDisplay(0,50,1.0,1.0,1.0,350,300,3);// 左边的中白圆
MyDisplay(0,50,0.0,0.0,0.0,450,300,3);// 右边的中黑圆
MyDisplay(0, 5,0.0,0.0,0.0,350,300,3);// 左边的小黑圆
MyDisplay(0, 5,1.0,1.0,1.0,450,300,3);// 右边的小白圆
myDisplay1();//整个圆的框架
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(100,100);
glutInitWindowSize(800,600);
glutCreateWindow("A Beautiful Graph");
init();
glutReshapeFunc(Reshape);
glutDisplayFunc(myDisplay);//注册当前窗口的显示回调函数
glutMainLoop();//进入GLUT事件处理循环
return 0;
}
评论0