[教育学]图形学第3章

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

2018/11/20
计算机图形学演示稿 岳俊 华制作(C)
14
第3章 基本图形生来自百度文库算法
以第一象限的直线为例。假设斜率m在0~1之间。如下 图所示。若通过(0,0)的直线的斜率m>l/2,它与x﹦1 直线的交点离y﹦l直线较y﹦0直线近,光栅点(1,1)比 (1,0)更逼近于该直线,因此应该取象素点(1,1)。如 果斜率m<l/2,则应取象素点(1,0)。当斜率m﹦l/2时, 差值相同,可以任选(1,1)或(1,0)象素点。
DDA直线生成算法的伪语言描述如下:
第3章 基本图形生成算法
begin if abs(x2﹣x1)≥abs(y2﹣y1) then lenght﹦abs(x2﹣x1) else lenght﹦abs(y2﹣y1) endif △x﹦(x2﹣x1)/lenght △y﹦(y2﹣y1)/lenght x﹦x1 y﹦y1 k﹦1 while(k≤lenght) putpixel(x,y) x﹦x﹢△x y﹦y﹢△y k ﹦k ﹢1 endwhile end
2018/11/20
此Bresenham算法 在计算直线斜率和误 差项时要用到浮点算 术运算和除法,如果 采用整数算术运算和 避免除法,可以加快 算法的速度。实际上, 误差项e的数值大小 与算法的执行没有什 么关系,相关的只是 e的符号,因此作简 单变换,即可得到整 数算法。
18
计算机图形学演示稿 岳俊 华制作(C)
已知一条直线段L(P0, P1),其端点坐标为: P0 (x0, y0), P1(x1, y1)。可计算出直线的斜率k 为:
y1 y0 k x1 x0
假定端点坐标均为整数,取直线起点P0 (x0, y0)作为初始坐标。画线过程从x的左端点x0开始, 向x右端点步进,每步x递增1,y递增k(即直线 斜率);取像素点(x,round(y))作为当前 点的坐标。
2018/11/20
计算机图形学演示稿 岳俊 华制作(C)
2
第3章 基本图形生成算法
最基本的图形显示方式是直线方式。实际上,无论什 么复杂图形,它们无非是由直线段和曲线段组成。而 对于曲线及各种复杂的图形,可以将其离散成许多小 直线段,连接各直线来逼近欲生成的曲线或其它复杂 图形,所以一般图形都可以看成是由直线段组成。因 此,直线段生成的质量好坏与速度快慢将直接影响整 个图形生成的质量和速度。在光栅显示器上显示图形 是将线段上所有象素点亮的过程。如果已知直线段两 个端点,可以有很多种不同的数学方法来决定应改变 在两端点之间的那些象素的亮度值才能显示出两点间 的直线。在绘图仪上绘直线段,主要决定X、Y方向上 的位移量,这些算法之间主要区别是判别和生成x、y 增量的过程和方法的不同。
if (fabs(x2-x1)>=fabs(y2-y1)) length=fabs(x2-x1); else length=fabs(y2-y1);
deltx=(x2-x1)/length; delty=(y2-y1)/length;
SetPixel(hdc,x,y,RGB(0,0,0 )); x=x+deltx; y=y+delty; k=k+1; Sleep(50); } }
2018/11/20
计算机图形学演示稿 岳俊 华制作(C)
10
第3章 基本图形生成算法
3.1.2 中点画线算法
假设x坐标为xp的各像素点中,与直线最近者已 确定,为P(xp,yp),那么,下一个与直线最近的像 素只能是正右方的P1(xp+1,yp),或右上方的P2 (xp+1,yp+1)两者之一。令M为P1和P2的中点, 易知M的坐标为(xp+1,yp+0.5)。 设Q是理想直线与垂直线x=xp+1 的交点。显然,若M在Q的下方,则P2 离直线近,应取为下一个像素;否则应 取P1。
Bresenham直线生成算法是由Bresenham提 出的一种精确而有效的光栅线段生成算法, 算法的目标是选择表示直线的最佳光栅位 置。为此,算法根据直线的斜率确定选择 变量在X方向上或在Y方向上每次递增一个 单位,另一变量的增量为0或1,它取决于 实际直线与最近网格点位置的距离,这一 距离称为误差。算法的构思巧妙,使得每 次只需检查误差项的符号即可确定所选象 素。
2018/11/20
计算机图形学演示稿 岳俊 华制作(C)
3
第3章 基本图形生成算法
1. 点的生成 点是图形中最基本的图素,直线、曲线以及其 它的图元都是点的集合。在几何学中,一个点既没 有大小,也没有维数,点只是表示坐标系统中一个 位置。在计算机图形学中,点是用数值坐标来表示 的。在直角坐标系中点由( x,y) 两个数值组成的 坐标表示。 在输出设备上输出一个点,就要把应用程序中 的坐标信息转换成所用输出设备的相应位置。对于 一个 CRT 监视器来说,输出一个点就是要在指定的 屏幕位置上打开电子束,使该位置上的荧光点亮。 在PC机中,点亮屏幕上一个点是由BIOS控制完 成的,各种程序语言中都有描点语句。例如 C 语言 为putpixel(x,y,color)。
计算机图形学演示稿 岳俊 华制作(C)
19
3.1.4 直线属性
第3章 基本图形生成算法
基本的线属性是线型、线颜色和线宽度。 1.线型:对线型的指定包括实线、虚线和点划线等。 2.线宽:常把图形设备能产生的最小直线宽度认为 是 1 个点宽度,例如1 个象素的宽度。以此作为基 本线宽,再定义二倍或四倍线宽。线宽的默认值 常选取基本线宽。 3.线色:线颜色由控制RGB监视器中三支电子枪的亮 度的RGB分量来给出。
第3章 基本图形生成算法
令a=y0-y1,b=x1-x0,c=x0y1-x1y0。 构造判别式: d=a(xp+1)+b(yp+0.5)+c d的初始值d0 = a+0.5b 在d≥0的情况下,取正右方像素P1, d1=a(xp+2)+b(yp+0.5)+c =d+a ---d1=2a 在d<0的情况下,取右上方像素P2, d2=a(xp+2)+b(yp+1.5) = d+a+b--d2=2(a+b)
第3章 基本图形生成算法
3.2 生成圆弧的常用算法
3.2.1 圆的特性
圆心位于原点的圆有四条对称轴:x=0,y=0, x=y和x=-y直线。若已知圆弧上一点(x,y),可 以得到其关于四条对称轴的其它7个点,这种性质 称为八对称性,如下图所示。 本节讨论的圆的生成算法 均只计算从x=0到x=y分段内 (1b区域)的像素点,其余的 像素位置利用八对称性即可得 出。
由于只包含加、减法和左移(乘2)的运算, 而且下一个像素点的选择只需检查di的符号,因此 Bresenham画线算法很简单,速度也相当快。
第3章 基本图形生成算法
根据上述思想的Bresenham直线生成算法描述如下:
begin x﹦x1 y﹦y1 x﹦x2-x1 y﹦y2-y1 m﹦y/x e﹦-1/2 for k﹦1 to x putpixel(x,y) e﹦e﹢m if(e≥0) y ﹦y ﹢ 1 e ﹦e ﹣ 1 endif x﹦x﹢1 next k endfor end
第3章 基本图形 生成算法
第3章 基本图形生成算法
物体的形状和颜色可用象素矩阵或直 线线段和多边形填充区域等基本几何结构 来描述。点和直线段是最简单的几何成分, 其它可供构造图形的输出图元有圆及其它 圆锥曲线、二次曲面和多边形填充区域以 及字符串等。而二维图形的生成是三维图 形生成的基础,研究计算机生成图形需先 从二维图形的生成开始。下面将讨论一些 基本二维图元生成技术和算法,以光栅图 形系统的扫描转换方法为基础。
第3章 基本图形生成算法
均假定所画直线的斜率k∈[0,1]。
3.1.1 DDA画线算法
DDA(Digital Differential Analyzer)画线 算法也称数值微分法,是一种增量算法。它的算 法实质是用数值方法解微分方程,通过同时对x和 y各增加一个小增量,计算下一步的x、y值。
第3章 基本图形生成算法
第3章 基本图形生成算法
由于我们使用的只是d的符号,而且d的增量 都是整数,只是其初始值包含小数。因此,我们 可以用2d代替d,来摆脱小数。 如果进一步把算法中2*a改为a+a等等,那 么这个算法不仅只包含整数变量,而且不包含乘 除法,适合硬件实现。
第3章 基本图形生成算法
3.1.3 Bresenham画线算法
2018/11/20 计算机图形学演示稿 岳俊 华制作(C) 4
3.1 生成直线的常用算法
第3章 基本图形生成算法
直线是点的集合,在几何学中直线被定义为两个点之间 的最短距离。也就是说一条直线是指所有在它上面的点 的集合。直线是一维的,即它们具有长度但没有面积。 直线可以向一个方向及其相反的方向无限伸长,这不是 计算机图形学中所需要的,在图形学中研究的对象是直 线段。已知线段的起点坐标(x1,y1),终点坐标(x2,y2), 这两点就确定了一条线段。 一般来讲,任何图形输出设备都能准确地画出水平 线X和垂直线Y,或对角线,但要画出一条准确斜线不是件 容易的事。在光栅系统中,线段通过象素绘制,水平和 垂直方向的台阶大小受象素的间隔限制。这就是说,必 须在离散位置上对线段取样,并且在每个取样位置上决 定距线段最近的象素,画一条直线实际上就计算出来一 系列与该线靠近的象素。
2018/11/20 计算机图形学演示稿 岳俊 华制作(C) 5
第3章 基本图形生成算法
(0,0)_(5,2) K=0.4 (0,0)-(1,0)-(2,1)-(3,1)-(4,2)-(5,2) X=1,y1=y0+k*(x1-x0)=y0+k=0+0.4=0.4 Round(y)=round(0.4)=0 Y2=y1+k=0.4+0.4=0.8 round(y2)=1
第3章 基本图形生成算法
3.2.2 中点画圆算法
假设x坐标为xp的各像素点中,与该圆弧最近者 已确定,为P(xp,yp),那么,下一个与圆弧最近的 像素只能是正右方的P1(xp+1,yp),或右下方的P2 (xp+1,yp-1)两者之一。 令M为P1和P2的中点,易知 M的坐标为(xp+1,yp-0.5)。 显然,若M在圆内,则P1离圆弧 近,应取为下一个像素;否则应 取P2。
2018/11/20
第3章 基本图形生成算法 Bresenham算法直线绘制例子: 考虑绘制从点(0,0)到(8,4)的线段。 初值计算:x=0 y=0 Δ x=8 Δ y=4 ( 循环计算过程部分: e﹦-x for k﹦1 To x putpixel(x,y) e﹦e﹢2y If (e≥0) y﹦y﹢1 e﹦e﹣2x endif x﹦x﹢1 )
2018/11/20
DDA方法计算象素位置 要比直接使用代数方程 快。它利用光栅特性消 除了代数方程中的乘法, 而在X和Y方向使用合适 的增量来逐步沿线段的 路径计算各象素位置。 但浮点增量的连续迭加 中取整误差的积累会使 长线段所计算的象素位 置偏离实际线段,而且 算法中的取整操作和浮 点运算仍然十分耗时。
第3章 基本图形生成算法
令dx=x2-x1,dy=y2-y1 递推公式 :di 1 di 2dy 2dx( yi yi 1 ) di的初值: d1 2dy dx 当di≥0时,选Ti,
di 1 di 2(dy dx)
di 1 di 2dy
当di<0时,选Si,
2018/11/20
计算机图形学演示稿 岳俊 华制作(C)
15
第3章 基本图形生成算法
过各行各列像素中心构造一组虚拟网格线,按 直线从起点到终点的顺序计算直线与各垂直网格线的 交点,然后确定该列像素中与此交点最近的像素。 由图3-5不难看出:若s<t, 则Si比较靠近理想直线,应 选Si;若s≥t,则Ti比较靠近 理想直线,应选Ti。
9
计算机图形学演示稿 岳俊 华制作(C)
第3章 基本图形生成算法
DDA直线绘制的C++实现
x=x1; void DDA直线绘制(HDC hdc) y=y1; { k=1; int k; double x1=50,y1=50,x2=300,y2=350; while(k<=length) { double x,y,deltx,delty,length;
相关文档
最新文档