第2章 光栅图形扫描转换算法

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

另外一种是所有满足x’-0.5≤x<x’+0.5 和y’-0.5≤y< y’+0.5 都映射到像素点(x’,y’)处。(四舍五入)
3
第2章 光栅图形扫描转换算法
直线段的扫描转换算法
当在计算机屏幕上表示一个图形时需要做一些处理,因 为一个图形经常是连续的(如一条直线),在直线上有无穷 多个点,但在屏幕上只有有限个像素,为了在有限的像素集 上表示一个无限的集合,就必须采用一些近似的算法,这就 是光栅扫描转换的本意。 直线的扫描转换: 确定最佳逼近于该直线的一组像素,并且 按扫描线顺序,对这些像素进行写操作。 主要介绍直线绘制的三个 常用算法:数值微分法( DDA)、中点画线法和 Bresenham算法。
17
第2章 光栅图形扫描转换算法
数值微分(DDA)法
x=6–y/4
18
第2章 光栅图形扫描转换算法
数值微分(DDA)法
在离散网格点情况下的“直线段”不是理想直线,这一 特性由以下两表可看出
直线 x y 0 5 1 5 2 6 3 6 直线 x y 6 0 6 1 6 2 5 3 y = 0.3 x + 5 4 6 5 7 6 7 7 7 8 7 9 10 11 12 8 8 8 9
0
1
2
3
4
5
12
第2章 光栅图形扫描转换算法
数值微分(DDA)法
void DDALine (int x0,int y0,int x1,int y1,int color) {int x; float dx,dy,k,y; dx=x1-x0; dy=y1-y0;
k=dy/dx; y=y0;
for(x=x0;x<=x1;x++) { putpixel(x,(int)y+0.5,color); y+=k; } }
16
第2章 光栅图形扫描转换算法
数值微分(DDA)法
void DDALine (int x0,int y0,int x1,int y1,int color) {int y; float dx,dy,k,x; dx=x1-x0; dy=y1-y0;
k=dx/dy;
x=x0;
for(y=y0;y<=y1;y++) { putpixel((int)x+0.5,y,color); x+=k; } }
6
第2章 光栅图形扫描转换算法
直线方程
(3)两点式 已知直线过两点p1(x1,y1)和p2(x2,y2),直线L的方程是:
y y1 x x1 y 2 y1 x 2 x1
(4)截距式 已知直线L在x轴和y轴的截距分别是a和b(a、b≠0), 直线L的方程是: x y 1 a b
26
第2章 光栅图形扫描转换算法
中点画线法 Pu
( xi 1, yi 1)
Q
M midpoint
( xi 1, yi )
2
1
Pd
( xi , yi )
previous
( xi 1, yi )
当M在Q的下方,则说明Pu离直线近,应为下一个像素点; 当M在Q的上方,应取Pd 为下一点。
22
第2章 光栅图形扫描转换算法
中点画线法
2、不仅仅考虑效率。DDA算法的核心是借用了直线的 斜截式方程(y=kx+b),而直线的方程有许多类型,如两点 式、一般式等。如用其它的直线方程来表示这条直线会不会 有出人意料的效果? 中点画线法就是采用了直线的一般式方程:f(x,y)=0, 即ax+by+c=0这种方式。
1
第2章 光栅图形扫描转换算法
概述 光栅图形学的研究内容
直线段的扫描转换算法
圆弧的扫描转换算法
多边形的扫描转换与区域填充 字符 裁剪 反走样 消隐
2
第2章 光栅图形扫描转换算法
扫描转换一个点
将图形区域上的数学点(x,y)转换为(x’,y’)的像素点,这里x 和y都是实数。实现的方法之一是取x的整数部分作为x’,取y 的整数部分作为y’。(自动取整) 如p1(1.7,0.8)点表示为像素点(1,0),p2(2.2,1.3)和 p3(2.8,1.9)都表示为像素点(2,1)。 即所有满足x’≤x<x’+1和y’≤y<y’+1 都映射到像素点 (x’,y’)处。
y 2 y1 k x 2 x1
5
第2章 光栅图形扫描转换算法
直线方程
(1)点斜式 已知直线L过定点p(x1,y1),斜率为k,直线L的方程是:
y y1 k ( x x1 )
(2)斜截式 已知直线的斜率是k,在y轴上截距是b,即和y轴交于p(0,b), 直线L的方程是:
y kx b
27
第2章 光栅图形扫描转换算法
中点画线法
如前所述,直线方程为F(x,y)=ax+by+c=0
欲判断Q在M的上方还是下方,只要把M代入F(x,y),并 判断它的符号即可。 构造判别式如下: d=F(xm,ym)=F(xi+1,yi+0.5) = a(xi+1)+b(yi+0.5)+c 当d<0时: M在Q下方,故应取Pu

k=5/2=2.5 >1
yi+1 = yi+k 7
6 5 4 3
x y+0.5 int(y+0.5)
0 2+0.5
1 4.5+0.5 2 7+0.5
2
5 7
2 0
15
1
2
3
4
5
第2章 光栅图形扫描转换算法
数值微分(DDA)法
如果直线从(0,2)点到(2,100)点呢?用光栅来显示的话,变 成了直线只用3个点来表示。光栅点太稀了!!!
7
第2章 光栅图形扫描转换算法
直线方程
(5)一般式 在坐标平面内,任何直线都可用含有变量x和y的一次方程来 表示:
Ax By C 0
8
第2章 光栅图形扫描转换算法
数值微分(DDA)法
基本思想
已知过端点p0(x0,y0)和p1(x1,y1) ,直线L的方程是:y=kx+b y1 y0 k 直线斜率为: x1 x0 假如有一条从左下角(0,2)到右上角(5,5)的直线段,中间 用哪些像素点表示? 6 一种直观的作法是:写 5 出线段的直线方程:y = kx+b 4 (斜截式),x从0到5,把每 3 个x的值代入直线方程求出相 2 应的y值。取像素点(x, int(y)) 0 1 2 3 4 5 作为当前点坐标。
10
第2章 光栅图形扫描转换算法
数值微分(DDA)法 下面引进图形学中一个很重要的思想——增量算法
yi+1 = kxi+1+b = k(xi+△x)+b 计算: = kxi+b+k△x = yi+ k△x yi 1 yi k 当△x=1时: 即:当x每递增1,y递增k(即直线斜率)! 这个式子的含义是:当前步的y值等于前一步的y值加上斜率 k。这样就把原来一个加法和乘法变成了现在的一个加法。大家 知道在计算机里乘法的计算量要比加法大得多,这样就极大地 提高了算法的效率。
y = 0.6 x – 0.73 5 2 6 3 7 3 8 4 9 10 11 12 5 5 6 6
这些特点在图形检索中会用到
21
第2章 光栅图形扫描转换算法
中点画线法Fra Baidu bibliotek
采用增量思想的DDA算法,每计算一个像素,只需计算 一个加法,是否最优?若非最优,如何改进? 有两种思路:1、改进效率。这个算法每步只做一个加 法,能否再提高效率? 加法已经是最快的算法了(加减乘除开方三角函数等)。 唯一改进的途径是把加法变成一种特殊的加法 — 把浮点运 算的加法变成整数加法。因为整数的加法比浮点的加法要快 很多(计算机科学问题的核心就是算法)。
解决方法是,当斜率的绝对值大于1时,x和y地位互换。即 取x和y变化大的轴作为参考轴以保证直线被光栅化后有足够多 的像素。 ︱k︱<1: yi+1 = yi+ k△x = yi+ k ( △x =1)
︱k︱>1: xi+1 = xi+ △y/k = xi+ 1/k ( △y =1) DDA算法直观、易实现,然而必须用浮点数表示,且每一 步运算都必须对和进行舍入取整,这使得它不利于用硬件实现
9
第2章 光栅图形扫描转换算法
数值微分(DDA)法
这个算法是可行的。光栅直线算法属于图形学最底层的 算法,算法的好坏严重决定着算法的效率。因为一个光栅算 法可能被几十万、几百万次的调用,也就是说当完成一个动 画算法或真实感图形算法时,底层算法是被反复调用的,因 此这种算法要精益求精,这种算法少一个乘法或加法都是一 个了不起的事情。 回顾一下刚才的算法,y=kx+b,需要做一个加法和一个 乘法,然后再取整,才能确定一个像素点。这样做不好,因 为计算量太大。如何把计算量减下来?
计算机图形学
第2章 光栅图形扫描转换算法
LOGO
第2章 光栅图形扫描转换算法
概述
随着光栅显示器的出现,为了在计算机上处理 显示图形,需要发展一套与之相适应的算法。光栅 图形学的算法从70年代开始到80年代成熟,虽然这 些算法已经不是现在图形学研究的主流,但是在图 形学中扮演着非常重要的角色,很多图形学的基本 思想都在这一章。

F ( x, y) ax by c 0
F(x, y) = 0
该直线方程将平面分为三个区域:


对于直线上的点:
对于直线上方的点:F(x, y) > 0 对于直线下方的点:F(x, y) < 0
24
第2章 光栅图形扫描转换算法
中点画线法
直线将平面分为三个部分 中点画线法提出的直线生成算法的基本原理是每次在最 大位移方向上走一步,而另一个方向是走步还是不走步要取 决于误差项的判断。
23
第2章 光栅图形扫描转换算法
中点画线法
直线的一般式方程:
F ( x, y ) y kx B 0 , 其中k
(x) y (y ) x (x) B 0
y y0 y 1 x x1 x0
其中:
a (y);
b (x);
c B(x)
25
第2章 光栅图形扫描转换算法
中点画线法
画直线段的过程中,当前像素点 为p(xi, yi),假定0≤k≤1 每次在x方向上加1,y方向上或 加1或加0。x是最大位移方向。
p(xi,yi)
pu(xi+1,yi +1) Q M(xi+1,yi +1/2) pd(xi+1,yi)
下一个像素点有两种可选择点pd(xi+1, yi)或pu(xi+1, yi+1)。若 M=(xi+1, yi+0.5)为pd与pu之中点,Q为理想直线与x=xi+1垂线 的交点。
x=6–y/4 5 4 5 5 5 6 4 7 4 8 4 4 3 3 9 10 11 12
两“直线”在这种情况下,无交点
19
第2章 光栅图形扫描转换算法
数值微分(DDA)法
20
第2章 光栅图形扫描转换算法
数值微分(DDA)法
两“直线”在这种情况下,有多个交点,而且多个交点不连续 直线 x y 0 0 1 0 2 1 3 1 直线 x 0 y -1 1 0 2 0 3 1 4 2 4 1 y = 0.33 x - 0.1 5 2 6 2 7 2 8 3 9 10 11 12 3 3 4 4
4
第2章 光栅图形扫描转换算法
直线方程
1、直线方程的几种形式 直线的斜率: 一条直线向上的方向与x轴的正方向所成的最小正角叫 做这条直线的倾斜角。一直线倾斜角的正切,叫做该直线 的斜率,常用k表示。平行于x轴的直线,其斜率为零,垂 直于x轴的直线斜率不存在。 设p1(x1,y1)、p2(x2,y2)所在直线的斜率为k,则有:
11
第2章 光栅图形扫描转换算法
数值微分(DDA)法
举例:用DDA算法扫描转换连接两点p0(0,2)和p1(5,5)的直线段 k=3/5=0.6 <1 x y+0.5 int(y+0.5) 0 2+0.5 1 2.6+0.5 2 3.2+0.5 3 3.8+0.5 4 4.4+0.5 5 5.0+0.5 2 3 3 4 4 5 6 5 4 3 2 yi+1 = yi+k
13
第2章 光栅图形扫描转换算法
数值微分(DDA)法 特点:
1.
2.
3. 4.
方法直观 效率低(y,k必须用浮点数表示,且每一 步运算都必须对y进行四舍五入) 迭代的算法 仅适用于k≤±1(斜率受限制)
14
第2章 光栅图形扫描转换算法
数值微分(DDA)法
来看看这个算法的不足:
如果x0<x1,则循环进行 for(x=x0;x<=x1;x++) 如果x0>x1,则不进行循环 ∴ 交换两点的坐标值 当|k|>1时 例如:用DDA算法连接两点p0(0,2)和p1(2,7)的直线段。
相关文档
最新文档