计算机图形学——扫描椭圆

来源:互联网 发布:mac电脑性能在线测试 编辑:程序博客网 时间:2024/06/07 12:12

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