要求:利用中点Bresenham算法扫描转换长半轴a=6, 短半轴b=5的椭圆
#include <iostream>
#include "stdio.h"
#include <stdlib.h>
#include <cmath>
#include <gl/glut.h>
using namespace std;
void CirclePoint(int x,int y)
{
glColor3f(0.0f,1.0f,0.0f);
glPointSize(2.0f);
glBegin(GL_POINTS);
glVertex2i(x+80,y+80);
glVertex2i(-x+80,y+80);
glVertex2i(-x+80,-y+80);
glVertex2i(x+80,-y+80);
glEnd();
glFlush();
}
void Midpoint(int a,int b)
{
int x,y;
float d1,d2;
x=0;
y=b;
d1=b*b+a*(-b+0.25);
CirclePoint(x,y);
while(b*b*(x+1)<a*a*(y-0.5))
{
if(d1<0)
{
d1+=b*b*(2*x+3);
x++;
}
else{
d1+=b*b*(2*x+3)+a*a*(-2*y+2);
x++;
y--;
}
CirclePoint(x,y);
}
d2=sqrt(b*(x+5)+a*(y-1)-a*b);
while(y>0)
{
if(d2<0)
{
d2+=b*b*(2*x+2)+a*a*(-2*y+3);
x++;
y--;
}
else{
d2+=a*a*(-2*y+3);
y--;
}
CirclePoint(x,y);
}
}
void Init(void)
{
glClearColor(1.0f,1.0f,1.0f,0.0f);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,150.0);
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
Midpoint(60,50);
}
int main(int argc,char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(100,100);
glutCreateWindow("Circle");
Init();
glutDisplayFunc(Display);
glutMainLoop();
return 0;
}