计算机图形学实验报告-实验1直线段扫描转换

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机图形学实验报告

班级计算机工硕班

学号2011220456

姓名王泽晶

实验一:直线段扫描转换

实验目的

通过本次试验,学生可以掌握直线段的扫描转换算法及其程序设计方法。

实验内容

1. 绘制20*20的网格线,格子X 和Y 方向间隔均为20像素,网格起始坐标在(20,20)。

我们使用此网格模拟像素矩阵(019,019x y ≤≤≤≤),格子交叉点是像素中心。

2. 输入直线段两端点,可使用以下两种方法之一:

a) 对话框输入

b) 鼠标在网格内以鼠标左键按下-拖动-抬起方式输入。注意:直线段两端点要自动

取整到模拟的像素中心位置

3. 进行直线段扫描转换,通过点击鼠标右键调用方式或者菜单调用的方式执行。计算完

成后,将扫描转换结果,在模拟的像素矩阵中,使用圆形显示出来。

方法一:直线的中点算法

算法的主要思想:

讨论斜率k ∈[1,+∞)上的直线段的中点算法。

对直线01p p ,左下方的端点为0p (x0,y0),右上方的端点为1p (x1,y1)。直线段

的方程为:

y mx B =+⇔y y x B xy yx xB x

∆=+⇔∆=∆+∆∆ (,)0F x y xy yx xB ⇔=∆-∆-∆=

现在假定已求得像素(,,i r i x y ),则如图得

,,11(,]22

i i r i r x x x ∈-+ 由于直线的斜率k ∈[1,+∞),故m=1/k ∈(0,1],则

1,,13(,]22

i i r i r x x x +∈-

+ 在直线1i y y =+上,区间,,13(,]22

i r i r x x -+内存在两个像素NE 和E 。根据取整原则,当11(,)i i x y ++在中点M 11(,)2i i x y ++右方时,取像素NE ,否则取像素E ,即 ,11,,1()()01()()0i r i i r i r i x E F M x x x NE F M x +++⎧⇔≤=⎨+⇔>⎩i i 点当(,y +1)在左方时点当(,y +1)在右方时

若取2()i d F M =,则上式变为

,1,,()01(0i r i i r i r i x E d x x NE d +⎧≤=⎨+>⎩点当点)当

计算i d 的递推公式如下:

,11,12[(2)()]0122(,2)0

122[(2)(1)]2i i r i i i i i i i r x y y x xB d d F x y d x y y x xB ++⎧∆+-∆+-∆⎪≤⎪=++=⎨>⎪∆+-∆++-∆⎪⎩ =20

2()0i i i i d x d d x y d +∆≤⎧⎨+∆-∆>⎩

算法的初始条件为:

00,00,0(,)(0,0)12(,1)22

r r x y x y d F x y x y =⎧⎪⎨=++=∆-∆⎪⎩ 相应的程序示例:

public function drawLine(pixelDrawer:Function, x0:int,y0:int,x1:int,y1:int):void

{

var 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==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 = -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为自变量递增

相关文档
最新文档