计算机图形学划线实验报告.docx
- 文档编号:29282531
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:11
- 大小:230.19KB
计算机图形学划线实验报告.docx
《计算机图形学划线实验报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学划线实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
计算机图形学划线实验报告
《计算机图形学》实验报告
实验一直线、圆(弧)生成算法
一、实验目的及要求
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、数值微分法
intx0=0,y0=0,x1=800,y1=400;//数值微分法,|k|<=1
floatdx,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中点画线法
COLORREFcolor=RGB(100,25,108);
intx0=0,y0=0,x1=800,y1=400;//中点画线法,0 inta,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(x { if(d<0) { 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生成算法 intx0=0,y0=0,x1=800,y1=200;//0 intx,y,dx,dy,i; floatk,e; dx=x1-x0; dy=y1-y0; k=(float)dy/(float)dx; e=-0.5;x=x0;y=y0; for(i=0;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即对应d>0.5的情况,给e减去1以保证在d始终在0、1之间。 在画其他斜率时只需根据实际情况对该程序做一定的改动。 详细见源代码中 4、中点画圆法 COLORREFcolor=RGB(100,25,108); intx,y,r=200; floatd; x=0;y=r;d=1-r; pDC->SetPixel(x,y,color); while(x { if(d<0) { d+=2*x+3; x++; } else { d+=2*(x-y)+5; x++;y--; } pDC->SetPixel(x+200,y+200,color); pDC->SetPixel(x+200,-y+200,color); pDC->SetPixel(-x+200,-y+200,color); pDC->SetPixel(-x+200,y+200,color); pDC->SetPixel(y+200,x+200,color); pDC->SetPixel(y+200,-x+200,color); pDC->SetPixel(-y+200,-x+200,color); pDC->SetPixel(-y+200,x+200,color); } 在画圆时用中点画圆法画出1/8圆,在描点时进行八次对称得到整个的图形。 5、Bresenham画圆算法 intr=200; intx,y,d,d1,d2,dir; x=0;y=r; d=2*(1-r); while(y>=0) { pDC->SetPixel(x+200,y+200,100); pDC->SetPixel(x+200,-y+200,100); pDC->SetPixel(-x+200,y+200,100); pDC->SetPixel(-x+200,-y+200,100); if(d<0) { d1=2*(d+y)-1; if(d1<=0) dir=1; else dir=2; } elseif(d>0) { d2=2*(d-x)-1; if(d2<=0) dir=2; else dir=3; } else { dir=2; } switch(dir) { case1: x++; d+=2*x+1; break; case2: x++; y--; d+=2*(x-y+1); break; case3: y--; d+=(-2*y+1); break; } } 在画圆时用Bresenham圆法画出1/4圆,在描点时进行八次对称得到整个的图形。 四、程序调试及结果的分析 由于画图中不能像以前的C语言一样自己输入起点和终点,于是我将直线斜率的五中情况放在一个程序中,直接赋上多组初值以实现不同斜率的直线,所有的结果都画出来了,但是直线在水平、笔直时完全没有一点锯齿出现,在其他斜率时会产生小锯齿,这在绘成的圆中看的较为明显。 这些都是由于像素点的选取所产生的误差,但这都是不可避免的。 五、实验心得及建议 第一次做计算机图形学实验,直线的生成是图形学中最基本也是最常见的图形生成,其原理与实现方法直接关系到其他复杂图形生成的效率,在之前上课中学习了直线的生成算法,并对其进行了改进。 我选用的数值微分法和中点画线法进行实验,斜率在0和1之间的直线都很容易绘制,而在其他的斜率就要通过改变程序中的部分来实现。 像数值微分方法在绘制斜率大于1的图形时就必须将原来程序上的x,y的地位交换,y每增加1,x相应增加1/k。 在刚开始我将中点画线法和数值微分法放在同一程序中,中点画线法定义的整型变量x,y,而数值微分法需要的是浮点型的变量,之前没有注意到这一点导致数值微分法的直线画不出来,在自习检查之后才发现这一错误。 之后再用Bresenham画线法画线的过程中我解决了一些课堂遗留问题,对画线方法的认识更加深刻了。 另外,在画圆的过程中,我用中点画线法进行,花了1/8的圆通过对称得到整圆。 起初将圆心选在(0,0)点,一直出现的是1/4圆,我没有意识到对话框里显示的只是第一象限的点,一直以为绘图方法出现了问题。 之后我将圆心移到点(200,200)得到了整个圆。 第一次的实验相对比较简单,在以后的实验中要吸取教训,不犯同样的错误。 姓名 院系班级 学号 实验日期 指导教师 实验成绩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 划线 实验 报告