实验 1 直接绘制实验 (提示:#表示 Project 的编号,##表示 Project 题目) 学号 姓名 上交时间 题号 程序逻辑 (40) 算法新颖 性(20) 代码规范 (20) 实验报告 (20) 总分 得分 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) 1 #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); 2 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; 3 } } (以上是实验报告的最小要求, 以后可以会根据各个 Project 的不同情况增加内容。 上交 时排版要美观。) 4