实验二 直线生成算法

一、实验目的和要求
1. 理解基本图形元素光栅化的基本原理,掌握一种基本图形元素光栅化算法,利用OpenGL实现直线光栅化的DDA算法。
二、实验内容及主要步骤代码
(1) 根据所给的直线光栅化的示范源程序,写出DDA算法,在计算机上编译运行,输出正确结果;
(2) 了解和使用OpenGL的生成直线的命令,来验证程序运行结果。
 
主要步骤代码:
(1)直线光栅化的DDA算法:
void LineDDA(int x1,int y1,int x2,int y2)  
{  
   float x, y, dx, dy;  
   int k,i;  
   if(abs(x2-x1)>=abs(y2-y1))  
    {  
        k=abs(x2-x1);  
    }  
    else  
    {  
        k=abs(y2-y1);  
    }  
    dx=(float)(x2-x1)/k;  
    dy=(float)(y2-y1)/k;  
    x=(float)(x1);  
    y=(float)(y1);  
    for(i=0;i<k; i++)  
    {  
       glPointSize(2);  
        glBegin (GL_POINTS);  
        glColor3f (1.0f, 0.0f, 0.0f);  
        glVertex2i ((int)(x+0.5),(int)(y+0.5));  
       glEnd ();  
        x+=dx;  
        y+=dy;  
    }    
}   

 

2.根据示范程序,以此为基础将其改造为圆的光栅化算法,写出相关代码。(只需要写出Bresenham算法生成圆的部分)
答:
(1)Bresenham算法生成圆
void  plot_circle_points(int xc,int yc,int x,int y)
{
      glBegin(GL_POINTS);
      glVertex3f(xc+x,yc+y,0);
      glVertex3f(xc-x,yc+y,0); 
glVertex3f(xc+x,yc-y,0);
      glVertex3f(xc-x,yc-y,0);
      glVertex3f(xc+y,yc+x,0);
      glVertex3f(xc-y,yc+x,0);
      glVertex3f(xc+y,yc-x,0);
      glVertex3f(xc-y,yc-x,0);
      glEnd();    
}
void drawcircle(int xc,int yc,int radius)
{
     int x,y,p;
     x=0;
     y=radius;
     p=3-2*radius;
     glClear(GL_COLOR_BUFFER_BIT);
     glBegin(GL_POINTS);
     while(x<y)
     {
          plot_circle_points(xc,yc,x,y);
          if(p<0)
                 p=p+4*x+6;
          else
          {
                 p=p+4*(x-y)+10;
                 y-=1;                
          }
          x+=1;          
     }    
     if(x==y)
          plot_circle_points(xc,yc,x,y);
}

 

posted @ 2018-01-10 20:00  疯狂麦洛  阅读(704)  评论(0编辑  收藏  举报