计算机图形学实验报告-实验1直线段扫描转换(共9页)_第1页
计算机图形学实验报告-实验1直线段扫描转换(共9页)_第2页
计算机图形学实验报告-实验1直线段扫描转换(共9页)_第3页
计算机图形学实验报告-实验1直线段扫描转换(共9页)_第4页
计算机图形学实验报告-实验1直线段扫描转换(共9页)_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上计算机图形学实验报告班级 计算机工硕班 学号 姓名 王泽晶 实验一:直线段扫描转换实验目的通过本次试验,学生可以掌握直线段的扫描转换算法及其程序设计方法。实验内容1. 绘制20*20的网格线,格子X和Y方向间隔均为20像素,网格起始坐标在(20,20)。我们使用此网格模拟像素矩阵(),格子交叉点是像素中心。2. 输入直线段两端点,可使用以下两种方法之一:a) 对话框输入b) 鼠标在网格内以鼠标左键按下-拖动-抬起方式输入。注意:直线段两端点要自动取整到模拟的像素中心位置3. 进行直线段扫描转换,通过点击鼠标右键调用方式或者菜单调用的方式执行。计算完成后,将扫描转换结果

2、,在模拟的像素矩阵中,使用圆形显示出来。方法一:直线的中点算法算法的主要思想:讨论斜率k1,+)上的直线段的中点算法。 对直线,左下方的端点为(x0,y0),右上方的端点为(x1,y1)。直线段的方程为: 现在假定已求得像素(),则如图得 由于直线的斜率k1,+),故m=1/k(0,1,则 在直线上,区间内存在两个像素NE和E。根据取整原则,当在中点M右方时,取像素NE,否则取像素E,即 若取,则上式变为 计算的递推公式如下: =算法的初始条件为: 相应的程序示例:public function drawLine(pixelDrawer:Function, x0:int,y0:int,x1:i

3、nt,y1:int):voidvar dx:Number = x1 - x0;var dy:Number = y1 - y0;var x:Number;var y:Number;if (dx = 0) && (dy = 0) )/ 两点重合时,直接绘制重合的点pixelDrawer( x0, y0 );return;else if ( dx=0 )/ 第二点落在X轴上,直接绘制直线上的点var step:Number = dy / Math.abs(dy);for (y=y0; y!=y1; y+=step ) pixelDrawer( x0, y );else if ( dy

4、=0 )/ 第二点落在Y轴上,直接绘制直线上的点step = dx / Math.abs(dx);for (x=x0; x!=x1; x+=step ) pixelDrawer( x, y0 );var stepX:Number = dx / Math.abs(dx);var stepY:Number = dy / Math.abs(dy);x = x0, y = y0;pixelDrawer( x, y ); / 绘制起点var k:Number = dy / dx;if ( Math.abs(k)<1.0 ) / 斜率<1的情形,以X为自变量递增var a:Number = -

5、Math.abs(dy);var b:Number = Math.abs(dx);var d:Number = 2 * a + b;var d1:Number = 2 * a;var d2:Number = 2 * (a + b);while ( x!=x1 )if ( d<0 ) x += stepX; y += stepY; d += d2; else x += stepX; d += d1; pixelDrawer( x, y );else / 斜率>=1的情形,以Y为自变量递增a = -Math.abs(dx);b = Math.abs(dy);d = 2 * a + b,

6、 d1 = 2 * a, d2 = 2 * (a + b);while ( y!=y1 )if ( d<0 ) x += stepX; y += stepY; d += d2; else y += stepY; d += d1; pixelDrawer( x, y );pixelDrawer( x1, y1 ); / 绘制终点编译运行程序得到如下结果:方法二:直线的数值微分法算法的主要思想: 由于课本上已经给出了斜率m-1,1上的算法,故此处给出斜率m1,+上的算法,m(-,-1上的可同理推导。 已知待扫描转换的直线为(x0,y0),又,则设k=1/m=(即k(0,1)。直线方程为,即。

7、 以一个像素为单位分割区间y0,y1,由x0<x1,故y0<y1,得到y0,y1上的一个划分:,. ,其中=+1,得到点列,由公式 故从直接得到。可能为浮点数,要对它取整,实际得到像素集。初值为:()=(x0,y0)。 实验内容:编写自定义的算法类,程序:public function drawLine(pixelDrawer:Function, x0:int,y0:int,x1:int,y1:int):voidvar dx:int = x1 - x0var dy:int = y1 - y0;if ( (dx = 0) && (dy = 0) )/ 两点重合时,直接

8、绘制重合的点pixelDrawer(x0, y0 );return;else if ( dx = 0 )/ 第二点落在X轴上,直接绘制直线上的点var step:int = dy / Math.abs(dy);for ( var y:int=y0; y!=y1; y+=step ) pixelDrawer( x0, y );else if ( dy = 0 )/ 第二点落在Y轴上,直接绘制直线上的点step = dx / Math.abs(dx);for ( var x:int=x0; x!=x1; x+=step ) pixelDrawer( x, y0 );elsevar k:Number

9、 = dy / dx;if ( Math.abs(k)<1 ) / 斜率<1的情形,以X为自变量递增var y2 : Number = 0.0;y2= y0;step = dx / Math.abs(dx);for ( x=x0; x!=x1; x+=step )pixelDrawer( x, int(y2 + 0.5) );y2 = y2 + k * step;else / 斜率>=1的情形,以Y为自变量递增var x2 : Number = 0.0;var kInv:Number = 1.0 / k;x2 = x0;step = dy / Math.abs(dy);for

10、 (y=y0; y!=y1; y+=step )pixelDrawer( int(x2 + 0.5), y );x2 = x2 + kInv * step;pixelDrawer( x1, y1 ); / 绘制终点编译运行程序得到如图所示结果: 方法三:生成直线段的Bresenham算法与中点算法类似,Bresenham算法也是通过在每列像素中确定与理想直线最近的像素来进行直线扫描转换的。为了讨论方便,此处假定直线的斜率在0,1之间。对直线对直线,左下方的端点为(x0,y0),右上方的端点为(x1,y1)。如图,由到,则d=d+m,一旦d 1时,d=d-1,以保证d始终在0,1之间。初始条件为

11、: 编写成员函数如下:public function drawLine(pixelDrawer:Function, x0:int,y0:int,x1:int,y1:int):voidvar dx:Number = x1 - x0;var dy:Number = y1 - y0;var step:Number;var x:Number;var y:Number;if ( (dx =0) && (dy =0) )/ 两点重合时,直接绘制重合的点pixelDrawer( x0, y0 );return;else if ( (dx =0) )/ 第二点落在X轴上,直接绘制直线上的点st

12、ep = dy / Math.abs(dy);for (y=y0; y!=y1; y+=step ) pixelDrawer( x0, y );else if ( (dy =0) )/ 第二点落在Y轴上,直接绘制直线上的点step = dx / Math.abs(dx);for (x=x0; x!=x1; x+=step ) pixelDrawer( x, y0 );var absDX:Number = Math.abs(dx);var absDY:Number = Math.abs(dy);var stepX:Number = dx / absDX;var stepY:Number = dy / absDY;var k:Number = dy / dx;if ( Math.abs(k)<1.0 ) / 斜率<1的情形,以X为自变量递增var e:Number = -absDX;x = x0;y = y0;for ( var i:Number=0; i!=dx; i+=stepX )pixelDrawer( x, y );x += stepX; e += 2 * absDY;if ( e>=0 ) y += stepY; e -= 2 * absDX;else / 斜率>=1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论