DDA算法 中点画线算法 Bresenham算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 +为P1与P2之中点,Q为P理想直线与x=xp +1垂线的交点。当M在Q的下方,则P2应为下一个像素点;M在Q 的上方,应取P1为下一个像素点。
Bresenham算法:过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线各垂直网格线的交点,然后确定该列像素中与此交点最近
的像素。
实验结果
成功运行三个算法,并且能转换出通用Bresenham算法。
3.分析与评论
(分析每个算法的运行时间,对你的本实验的工作进行评论,同时也可以对老师提出建议。)
附录: Source Code(in C)
#include
{
glClearColor, , , ;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f , , ;
glRectf, , , ;
glBegin (GL_TRIANGLES);
glColor3f , , ; glVertex2f , ;
glColor3f , , ; glVertex2f , ;
glColor3f , , ; glVertex2f , ;
glEnd ();
glColor3f(1,0,0);
glBegin(GL_LINE_LOOP);
glVertex2f , ;
glVertex2f , ;
glVertex2f , ;
glEnd ();
glPointSize(3);
glBegin (GL_POINTS);
glColor3f , , ; glVertex2f , ;
glColor3f , , ; glVertex2f , ;
glColor3f , , ; glVertex2f , ;
glEnd ();
glFlush();
}
int main(int argc, 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)(int x,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(int i=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的不同情况增加内容。上交时排版要美观。)