要求:利用中点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; }