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

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


猜你喜欢

转载自blog.csdn.net/cd1202/article/details/72887700
今日推荐