当前位置:首页 > 计算机图形学实验报告2
计算机图形学实验报告
实验名称 直线、圆弧及曲线的生成算法 评分 实验日期 2012 年 5 月 15 日 指导教师 刘长松 姓名 专业班级 学号
一、实验目的
1、几种直线生成算法的比较,特别掌握用Bresenham直线生成算法。 2、几种圆弧生成算法的比较,掌握Bresenham圆弧生成算法。 3、掌握用像素点法直接生成其它曲线的方法。
二、实验要求
1、用不同的生成算法在屏幕上绘制出直线的图形,对不同的算法可设置不同的线形或颜色表示区别。
2、用Bresenham生成算法在屏幕上绘制出圆弧的图形,用动画的方式表演图形的生成。
三、关键算法及实现原理
1、有关直线生成算法有:DDA(数值微分)直线算法、逐点比较法、直线Bresenham生成算法。
直线Bresenham生成算法思想如下(第一象限,且斜率k<1的情况 图2-1 a
中的1a):
1) 画点(x1,y1),dx=x2-x1,dy=y2-y1,计算误差初值P1=2dy-dx,i=1; 2) 求直线下一点位置 xi+1=xi+1 如果Pi>0,则yi+1=yi+1,否则 yi+1=yi; 3) 画点(xi+1,yi+1);
4) 求下一个误差Pi+1点,如果Pi>0,则Pi+1=Pi+2dy-2dx,否则 Pi+1=Pi+2dy;
5) i=i+1,如果i 3)只做整数加减运算和乘2运算,而乘2运算可以用移位操作实现。 Bresenham算法的速度很快,并适于用硬件实现。 对于图2-1 a中的2a,只需将xi+1=xi+1改为xi+1=xi-1。 对于图2-1 a中的1b,斜率k>1的情况,可交换变量x和y,y每次长1个单位。对Pi进行判断,xi+1=xi或xi+1=xi+1。 2、有关圆弧生成算法有:逐点比较法、DDA(数值微分)直线算法、圆的Bresenham生成算法。 圆的生成算法一般将圆划分为8等份,只需计算(900,450)的八分之一圆弧,其它用对称法求得(参见图2-1 b)。 Bresenham生成算法思想如下(第一象限,且斜率k<1的情况): 1) 2) 计算误差初值P1=3-2r,i=1,画点(0,r); 求下一个光栅点位置 xi+1=xi+1 如果Pi<0,则yi+1=yi,否则 yi+1=yi-1; 3) 画点(xi+1,yi+1); 4) 求下一个误差Pi+1点,如果Pi<0,则Pi+1=Pi+2xi+6,否则 Pi+1=Pi+4(xi-yi)+10; 5) i=i+1,如果x=y则结束操作,否则转步骤2。 (-y,x)2b2a3ao3b4b1b(x ,y )11(x ,y )22(y,x)1b1a1a4a(-x,y)2a(-x,-y)3a2b(x,y)o3b4b4a(x,-y)(-y,-x)图2-1 a 直线方向的8个象限(y,-x)图2-1 b 圆心在(0,0)点圆周生成时的对称变换 圆Bresenham算法的算式简单,只需做加减法和乘4运算 3.对屏幕布局的考虑 适当选取坐标,将屏幕分成几个区域性,在每个区域内实现一种算法,生成 一个图形。也可用delay实现延时实现动画。 四、程序运行结果或数据 //输入信息: //运行结果: 五、实验收获及体会 通过这个实验,掌握用Bresenham直线生成算法跟Bresenham圆弧生成算法, 还掌握用像素点法直接生成其它曲线的方法。这个实验代码不是很繁琐,主要是通过算法来实现图像,在实验过程中由于对Bresenham直线生成算法和Bresenham圆弧生成算法掌握得不是很透彻所以遇到过一些麻烦,不过也都在老师的帮助下解决了一些麻烦,顺利完成了实验。 六、参考源程序(可附页) //源代码: #include int main(void) { } int x1,y1,x2,y2,xi,yi; int dp,dy,dx; int gdriver,gmode; initgraph(&gdriver,&gmode,\ while(true) { } closegraph(); return 0; //输入直线的两个点 printf(\第一象限内):\\n\scanf(\if(x1 < 0 || y1 < 0 || x2 < 0 || y2 < 0) break; if(x2 < x1) { int temp = x2; x2 = x1; x1 = temp; temp = y2; y2 = y1; y1 = temp; } dy = y2 - y1; dx = x2 - x1; dp = dx - 2 * dy; for(yi=y1,xi=x1; xi <= x2; ++xi) { putpixel(xi,yi,RGB(255,0,0)); } if(dp < 0) { } else dp = dp - 2 * dy; dp = dp + 2* dx - 2 * dy; ++yi;
共分享92篇相关文档