计算机图形学划线实验答案.doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《计算机图形学》实验报告 实验一 直线、圆(弧)生成算法 一、实验目的及要求 1. 了解光栅图形显示器的工作原理和特点; 2. 学习C/VC环境下的基本绘图方法; 3. 实践与巩固直线的基本生成算法。? 4. 掌握直线扫描转换算法的原理及实现; 5. 学习圆(弧)的基本生成算法; 6. 实践圆(弧)的基本生成算法; 7. 掌握圆弧扫描转换算法的原理及实现; 二、理论基础 1、有关直线生成算法有 DDA(数值微分)、中点画线线算法、Bresenham生成算法 数值微分法先算出直线的斜率,然后从起点开始,确定最佳逼近于直线的y坐标。假设起点的坐标为整数。让x递增1,y相应递增k。 中点划线算法中若直线在x方向增加一个单位,y的增量只能在0、1之间。假设当前像素点已经确定,下一像素点就只可能有两种情况,将这两点的中点带入直线方程中,通过中点在直线的上、下方来判断下一点的坐标。 Bresenham算法是通过各行、各列像素中心构造一组虚拟网络格线,按直线从起点到中点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。 2、有关画圆的算法 圆的扫描转换(中点画圆法)、Bresenham画圆算法 圆的扫描转换算法同中点画线类似,将圆分为8份,先讨论圆的第一象限上半部分,从(0,R)点顺时针确定最佳逼近于该圆弧的像素序列。之后通过对称画出全部圆。 Bresenham画圆算法考虑圆在第一象限上的点,每确定一像素,则下一像素有三种可能,通过判断右下方的像素与圆的位置关系再分为三种情况,之后通过这三个点与圆的距离远近确定最佳逼近像素。 三、算法设计与分析 1、数值微分法 int x0=0,y0=0,x1=800,y1=400; //数值微分法,|k|=1 float dx,dy,k,x,y; dx=x1-x0; dy=y1-y0; k=dy/dx; y=y0; for(x=x0;x=x1;x++) { pDC-SetPixel(x,int(y+0.5),color); y=y+k; } 该程序中每一步的x、y值是用前一步的值加上一个增量来获得的。在程序中y与k必须用浮点数表示,每一步都必须对y进行取整。此程序只能用于计算|k|=1的情形,当直线的斜率的绝对值超过1是,必须把x、y的地位进行交换,y每增加一,x相应增加1/k. 2中点画线法 COLORREF color=RGB(100,25,108); int x0=0,y0=0,x1=800,y1=400; //中点画线法,0k1 int a,b,d1,d2,d,x,y; a=y0-y1; b=x1-x0; d=2*a+b; d1=2*a; d2=2*(a+b); x=x0; y=y0; pDC-SetPixel(x, y, color); while (xx1) { if (d0) { x++; y++; d+=d2; } else { x++; d+=d1; } pDC-SetPixel (x, y, color); } 该程序只能用于计算斜率在0、1之间的直线,从中点划线法思想计算得出的初值d0=a+0.5b为浮点型数据,由于我们只需要d的符号,而且d的增量都是整数,只是其初始值包含小数,因此,在程序中我们可以用2d代替d,来摆脱小数, 在画别的的情况斜率的直线时,将此程序中的a,b,x,y做相应的改变,具体在源程序中呈现。 当画任意起始点的直线时,只需将x0、x1、y0、y1的次序做相应的调整使之满足程序所给条件。 3、Bresenham生成算法 int x0=0,y0=0,x1=800,y1=200; //0k1 int x,y,dx,dy,i; float k,e; dx=x1-x0; dy=y1-y0; k=(float)dy/(float)dx; e=-0.5;x=x0;y=y0; for(i=0;idx;i++) { pDC-SetPixel(x,y,255); x=x+1; e=e+k; if(e=0) { y=y+1; e=e-1; } } 该程序原本要通过直线与网格交点与0.5之间的关系来判断下一像素点是取右方还是右上方(以斜率大与一为例),改进后的程序用e=d-0..5的正负判断下一像素点的取值。当e大于0即

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档