一、实验目的和要求
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);
}