3、图形光栅化2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
缺点: 数据结构复杂 只适合软件实现
边界标志算法
• 基本思想: • 帧缓冲器中对多边形的每条边进行直线扫
描转换,亦即对多边形边界所经过的象素 打上标志。 • 然后再采用和扫描线算法类似的方法将位 于多边形内的各个区段着上所需颜色。 • 使用一个布尔量inside来指示当前点是否在 多边形内的状态。
扫描线种子算法
扫描线填充算法
y
利用图形的空间连贯性和扫 8
描线的连贯性
7 P5 6 5 4 I1 3
I2 P4
P3 I3 I4
求交:I4, 排序:I1,
I3, I2,
I2, I3,
I1 I4
2 1
P1
P2
交点配对:(I1, I2), (I3, 0I4)1 2 3 4 5 6 7 8 9 10 x
区间填色
中点画圆算法
• 构造函数:F(X,Y)=X2 + Y2 R2 ;则
• F(X,Y)= 0 (X,Y)在圆上; • F(X,Y)< 0 (X,Y)在圆内; • F(X,Y)> P01 (X,Y)在圆外。 • 设M为P1、PM2间的中点,
M=(Xp+1,Yp-P02 .5)
中点画圆算法
• d = F(M) = F(xp + 1, yp - 0.5)
中点画圆算法
• 若d>=0, 则P2 为下一个象素,那么再下 一个象素的判别式为:
• d1 = F(xp + 2, yp - 1.5)

= (xp + 2)2 + (yp - 1.5)2 - R2

= d + (2xp + 3)+(-2 ypP+1 2)
• 即d 的增量为 2 (xp - yp) +5 M
边界标志算法
• 用软件实现时,扫描线算法与边界标志算 法的执行速度几乎相同,
• 但由于边界标志算法不必建立维护边表以 及对它进行排序,所以边界标志算法更适 合硬件实现,这时它的执行速度比有序边 表算法快一至两个数量级。
边填充算法
P5
P5
P3
P4
P1
P2
P1
(a)
P5 P3
P4
P1
P2
(d)
P3 P4

=(xp + 1)2 + (yp - 0.5)2 - R2
• 若d<0, 则P1 为下一个象素,那么再下一个
象素的判别式为:
P1
• d2 = F(xp + 2, yp - 0.5)

= (xp + 2)2 + (yp - 0.5)2 - R2M
P2

= d + 2xp +3
• 即d 的增量为 2xp +3.
• 只需对当前扫描线的活性边表作更新 ,即可得到下一条扫描线的活性边表。
活性边表算法
如何计算下一条扫描线与边的交点。 Pj+1
直线方程:ax+by+c = 0 当前交点坐标:(xi, yi)
(xi+1,yi+1) y=yi+1
xi+1= ((-b活yi下+动1一)边-c交表)/a点中=坐需((标-要b:y存i-(b放x)i-+的c1)/,信yai=+息x1i):-b/(Paxj=i,xyii+) 1/k
边界标志算法
•void edgemark_fill(polydef, color) •多边形定义 polydef; int color; •{ 对多边形polydef 每条边进行直 线扫描转换; • inside = FALSE; • for (每条与多边形polydef相交的 扫描线y ) • for (扫描线上每个象素x ) •{
C
若夹角和为360°,则点p 在多边形内
多边形的扫描转换与区域 填充
射线法检验交点数
P
E
AEຫໍສະໝຸດ APBD C
交点数=偶数(包括0) 点在多边形之外
B
D C
交点数=奇数 点在多边形之内
多边形的扫描转换与区域 填充
扫描线填充算法---扫描线顺序 有序边表算法 边填充算法
种子填充算法---内部一个点出发 简单种子算法
yli2)时,应该取Li。否则取Hi
Bresenham画圆算法

剩下的问题是如何快速的计算di。
设图中Pi-1的坐标为(xi-1,yi-1),则Hi和Li
的坐标为(xi,yi-1)和(xi,yi-1-1 )

di = xi2 + yi-12 + xi2 + (yi-1-1)2 -
2R2

=2xi2 + 2yi-12 - 2yi-1 - 2R2
• Hi+1和Li+1的坐标为(xi+1,yi)和
Bresenham画圆算法
• 当di<0时 -> 取Hi -> yi=yi-1,则 • di+1 = di + 4xi-1 + 7 • 当di ≥ 0时 -> 取Li -> yi=yi-1-1,则 • di+1 = di + 4(xi-1-yi-1) + 11 • 易知 x0=0, y0=R, x1=x0+1
圆弧的扫描转换
• X2 + Y2 = R2
• Y = Sqrt(R2 - X2)
y
• 在一定范围内,每给定一
• X值,可得一Y值。
• 当X取整数时,Y须取整。
• 缺点:浮点运算,开方,
x
• 取整,不均匀。
中点画圆算法
• 利用圆的对称性,只须讨论1/8圆(第二个8 分圆)P(Xp ,Yp )
P1 M P2
528 .
P3P4
11 0 8 ∧
y=6.5
P6P1
207 .
P5P6
3.5 -1.5 7
P4P5
728 .
P3P4
11 0 8 ∧
y=7.5
P4P5
928 .
P3P4
11 0 8 ∧
活性边表算法
step1:把新边表ET[i]中的边结点,用插入排序法 插入活性边 表AET,使之按X坐标递增顺序排序;
y=yi
x:当前扫描线与边的交点
△x=-b/a:从当前扫描线到下一条扫描线之间的x增量
ymax:边所交的最高扫描线
活性边表算法
• 活性边表的更新(插入、删除) • 为了方便边的活性边表的更新,建立另
一个表—新边表(NET),存放在该扫 描线第一次出现的边。 • 存放的信息: • x:扫描线与该边的初始交点 • △x:x的增量 • ymax:该边的最大y值
y
P4
8 P6
7
6
P5
5
4
3
P3
2 1
P1
P2
0 1 2 3 4 5 6 7 8 9 10 11
活性边表
P1P2
y=1.5 5 -3 2 .
y=3.5 y=4.5 y=5.5
P6P1
207 .
P6P1
207 .
P6P1
207 .
8.5

7.5 6.5
边 5.5
表 4.5
3.5
2.5
1.5
x 0.5
4连通区域边界填充算 法的填充结果
8连通区域边界填充算 法的填充结果
简单种子填充算法
• 种子像素入栈,当栈非空时,重复以下步骤 :
• (1)栈顶像素出栈 • (2)将出栈象素置成填充色 • (3)按右、上、左、下顺序检查与出栈象素
相邻的四象素,若其中某象素不在边界上 且未被置成填充色,则将其入栈
简单种子填充算法
67
缺点?
5 4S9
S
328
5
34667
28888889
444444444
7 7 7 7 7 7 7 7 77
S
9 9 9 9 9 9 9 9 9 99
简单种子填充算法
• 4-connected boundary-fill
• void BoundaryFill4(int x,int y,int fill,int boundary)
活性边表算法
• 影响一般扫描线填充算法效率的因素

求交和排序
所有的边和扫描线求交,效率很低。因为一条扫描线往往只和 少数几条边相交。
如何提高效率? 目标是简化交点计算
建立每条扫描线的活性边表
何谓活性边?
活性边表算法
• 与当前扫描线相交的边称为活性边( active edge),把它们按与扫描线交点x 坐标递增的顺序存入一个链表中—活性 边表 ( AET, Active Edge Table)。它记 录了多边形边沿扫描线的交点序列。
328
种子填充算法
• 假设多边形区域内至少有一个像素已知
区域定义法: Interior-defined Boundary-defined
Flood-fill algorithm Boundary-fill algorithm
区域连通方式: 4-connected 8-connected
种子填充算法
光栅图形学2
• 圆弧的扫描转换 • 两个常用算法 • 中点画圆法 • Bresenham画圆算法 • 多边形的扫描转换与区域填充 • 两个代表性算法 • 活性边表扫描线算法 • 种子填充算法
圆弧的扫描转换
下面仅以圆心在原点、半径R为整数的圆为例,讨论圆的 生成算法。
假设圆的方程为: X2 + Y2 = R2
•{
• int current;
• current =
4-connected flood-fill void FloodFill4(int x,int y,int
fillColor,int oldColor) {
int current; current = getpixel(x, y); if (current == oldColor)
5
4
3
2 P1
P2
1
x 0 1234567
7y
6
5
4
3
2
1
xx
0 1234567
扫描线填充算法
• 顶点交点的计数问题
P3 I5
5
4
I4
3
P4
2
I1
I2
1
P5
0
P1 I6
扫描线5
扫描线4
扫描线3
I3
扫描线2
扫描线1 P2
计数0次 计数1次 计数2次
检查交于该顶点的两条边的另外两个端点的y值大于该顶点y值的 个数
Bresenham画圆算法
Bresenham画圆算法的五种情形
(1) (x,y)
H(x+1,y)
(5) V(x,y-1) (4)
(2) D(x+1,y-1) (3)
多边形的扫描转换与区域填充
多边形分为凸多边形、凹多边形、含内环的多边形。
多边形的扫描转换即把多边形的顶点表示转换成点阵表示。
多边形的扫描转换与区域填充
P2P3
5 33
P3P4
11 0 8
P3P4
11 0 8
P5P6
5 -1.5 7



P4P5
P5P6
5 2 8 . 5 -1.5 7 ∧

11 0 8 ∧ P3P4
2 0 7 ∧ P6P1

5 -3 2 .
P1P2
P6P1
∧ y=2. 2 0 7 .
5

5 33∧
P2P3
P2P3
8 33∧

P4P5
Bresenham画圆算法
• 从A点开始向右下方逐点来寻
找弧AB要用的点。如图中点
Pi-1是已选中的一个表示圆弧
上的点,根据弧AB的走向,
A
B 下一个点应该从Hi或者Li中选
择。显然应选离AB最近的点
作为显示弧AB的点。
• 假设圆的半径为R,显然,当
xhi2 + yhi2 -R2 ≥ R2 - (xli2 +
P4
P5 P3
P4 P4
P5 P3
P4
P1
P2
P1
(a)
P5
P3
P4
P2
(b)
P5
P1
P2
(c)
P3 P4
P1
P2
(d)
P1
P2
(e)
• 引入栅栏的目的?(进一步改进的边标
种子填充算法
• 种子填充指先将区域的一点赋予指定的 颜色,然后将该颜色扩展到整个区域的 过程。种子填充算法要求区域是连通的
67 5 4S9
解决的主要问题是什么?
• 确定待填充的象素,即检查光栅的每一像 素是否位于多边形区域内
图案填充还有一个象素填什么颜色的问题
多边形的扫描转换与区域 填充
点在多边形内的包含性检验
• 检验夹角之和 • 射线法检验交点数
多边形的扫描转换与区域 填充
检验夹角之和
A A
P
E B
B
E
P
D
D
C
• 若夹角和为0 ,则点p在多边形
step2:遍历AET表,把配对交点之间的区间(左闭右开)上的各 象素(X,Y),用setpixel(x,y,color)改写象素颜色值;
step3:遍历AET表,把Ymax=i的结点从AET表中删除,并把 Ymax>i的结果点的X值递增△X; step4:重复各扫描线
活性边表算法
• 优点: • 对每个像素只访问一次 • 与设备无关
P2
(b)
P5
P1
P5 P3
P4
P1
P2
(c)
P3 P4
P2
(e)
边填充算法
• 优点: • 最适合于有帧缓存的显示器 • 可按任意顺序处理多边形的边 • 仅访问与该边有交点的扫描线上右方的
像素,算法简单 • 缺点: • 对复杂图形,每一像素可能被访问多次
,输入/输出量大
栅栏填充算法
栅栏线
P5 P3
• d的初值:
P2
• d0 = F(1, R-0.5)
中点画圆算法
• MidpointCircle(int r, int color)
•{

int x,y;

float d;

x=0; y=r; d=1.25-r;

drawpixel(x,y,color);

while(x<y){

if(d<0){ d+ = 2*x+3;
扫描线5 扫描线2
扫描线填充算法
y
y
7
7
• 填充扩大化问题
6
5 P4
P3
6 5
4
4
解决方法3:
3
取中心扫描线12 yP+1 0.5 P2
2 1
检查交点右方像素的中心0 是1 否2 落3 4在5 区6 间7 内x 0 1 2 3 4 5 6 7 x
xl≤x+0.5≤xr
左闭右开 下闭上开
7y
6
P4
P3
相关文档
最新文档