DDA算法 中点画线算法 Bresenham算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验1直接绘制实验

(提示:#表示Project的编号,##表示Project题目)

学号姓名上交时间

1.问题描述

如何利用OpenGL实现直线光栅化的DDA算法、中点画线算法和Bresenham算法2.算法描述

DDA算法:据直线公式y = kx + b来推导出来的,其关键之处在于如何设定单位步进,即一个方向的步进为单位步进,另一个方向的步进必然是小于1。

中点划线法:在画直线段的过程中,当前像素点为(xp ,yp ),下一个像素点有两种可选择点P1(xp +1,yp )或P2(xp +1,yp +1)。若M=(xp +1,yp +0.5)为P1与P2之中点,Q 为P理想直线与x=xp +1垂线的交点。当M在Q的下方,则P2应为下一个像素点;

M在Q的上方,应取P1为下一个像素点。

Bresenham算法:过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线各垂直网格线的交点,然后确定该列像素中与此交点最近

的像素。

实验结果

成功运行三个算法,并且能转换出通用Bresenham算法。

3.分析与评论

(分析每个算法的运行时间,对你的本实验的工作进行评论,同时也可以对老师提出建议。)

附录: Source Code(in C)

#include //需要正确安装GLUT,安装方法如预备知识中所述void myDisplay(void)

{

glClearColor(0.0, 0.0, 0.0, 0.0);

glClear(GL_COLOR_BUFFER_BIT);

glColor3f (1.0f, 1.0f, 1.0f);

glRectf(-0.5f, -0.5f, 0.5f, 0.5f);

glBegin (GL_TRIANGLES);

glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (0.0f, 1.0f);

glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.8f, -0.5f);

glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (-0.8f, -0.5f);

glEnd ();

glColor3f(1,0,0);

glBegin(GL_LINE_LOOP);

glVertex2f (0.0f, 0.5f);

glVertex2f (0.4f, -0.25f);

glVertex2f (-0.4f, -0.25f);

glEnd ();

glPointSize(3);

glBegin (GL_POINTS);

glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (-0.4f, -0.4f);

glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.0f, 0.0f);

glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (0.4f, 0.4f);

glEnd ();

glFlush();

}

int main(intargc, char *argv[])

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

glutInitWindowPosition(100, 100);

glutInitWindowSize(400, 400);

glutCreateWindow("Hello World!");

glutDisplayFunc(&myDisplay);

glutMainLoop();

return 0;

}

通用算法:

int Sign(int n){

if(n>0) return 1;

if(n==0) return 0;

if(n<0) return -1;

}

void Bresenham(int x0,int y0,int x1,int y1,void (*setPixel)(intx,int y)){ int x,y,dx,dy,s1,s2,temp=0,interchange;

x=x0; y=y0;

dx=abs(x1-x0); dy=abs(y1-y0);

s1=Sign(x1-x0); s2=Sign(y1-y0);

if(dy>dx){

temp=dx; dx=dy; dy=temp;

interchange=1;

}

else

interchange=0;

int e=2*dy-dx;

for(inti=1;i<=dx;++i){

setPixel(x,y);

while(e>0){

if(interchange==1)

x=x+s1;

else

y=y+s2;

e=e-2*dx;

}

if(interchange==1)

y=y+s2;

else

x=x+s1;

e=e+2*dy;

}

}

(以上是实验报告的最小要求,以后可以会根据各个Project的不同情况增加内容。上交时排版要美观。)

相关文档
最新文档