(计算机图形学)基本图形的扫描转换
广工数媒计算机图形学之5基本图形生成算法-多边形扫描转换及区域填充

计算机图形学基础:基本图形生成算法——多边形扫描转换及区域填充 多边形扫描转换——x-扫描线算法 x-扫描线算法填充多边形基本思路:
扫描线与x轴平行。按照扫描顺序,计算每一条扫描线与多边 形的相交区间,用指定颜色显示区间内的像素。区间的端点 可以通过计算扫描线与多边形边界线的交点获得。 x-扫描线算法可以填充凸、凹多边形,也可填充中间有空的 多边形。
广东工业大学机电学院图学与数字媒体工程系
计算机图形学基础:基本图形生成算法——多边形扫描转换及区域填充
多边形扫描转换——x-扫描线算法
x-扫描线算法涉及的问题: 一、扫描线与多边形边界交点的 有效性判别; 扫描线y=5与AB边有无效交点k, 在做求交运算之前,判断该扫 描线的y坐标不在点A和点B的y 坐标之间,不做求交运算。
广东工业大学机电学院图学与数字媒体工程系
计算机图形学基础:基本图形生成算法——多边形扫描转换及区域填充
区域填充——边界填充算法
栈结构实现4-连通边界填充算法步骤: (1)种子像素入栈; (2)栈顶象素出栈; (3)将出栈象素置成填充色; (4)检查出栈象素的4-邻接点,若其中某个象素点不是边 界色且未置成多边形色,则把该象素入栈。 (5)检查栈是否为空,若非空,则执行步骤(2),若为 空,则结束。 4-连通边界填充.SWF
广东工业大学机电学院图学与数字媒体工程系
计算机图形学基础:基本图形生成算法——多边形扫描转换及区域填充 填充算法——边缘填充算法
“边缘填充算法的过程.SWF”演示了边缘填充算法的实现过 程。 该算法的优点是简单,缺点是对于复杂图形,每一像素可 能要访问多次,效率降低。
广东工业大学机电学院图学与数字媒体工程系
计算机图形学——多边形的扫描转换(基本光栅图形算法)

计算机图形学——多边形的扫描转换(基本光栅图形算法)⼀、多边形扫描转换在光栅图形中,区域是由【相连的】像素组成的集合,这些像素具有【相同的】属性值或者它们位于某边界线的内部1、光栅图形的⼀个基本问题是把多边形的顶点表⽰转换为点阵表⽰。
这种转换成为多边形的扫描转换。
2、多边形的扫描转换与区域填充问题是怎样在离散的像素集上表⽰⼀个连续的⼆维图形。
3、多边形有两种重要的表⽰⽅法:(1)顶点表⽰:⽤多边形的定点序列来表⽰多边形优点:直观、⼏何意义强、占内存少、易于进⾏⼏何变换缺点:没有明确指出那些象素在多边形内,故不能直接⽤于上⾊(2)点阵表⽰:是⽤位于多边形内的象素集合来刻画多边形缺点:丢失了许多⼏何信息(eg:边界、顶点等)但是【点阵表⽰是光栅显⽰系统显⽰时所需的表现形式。
】多边形的扫描转换就是把多边形的顶点表⽰转换为点阵表⽰,即从多边形的给定边界出发,求出位于其内部的各个像素,并将帧缓冲器内的各个对应元素设置相应的灰度或颜⾊。
实际上就是多边形内的区域的着⾊过程。
4、多边形分类⼆、X扫描线算法X扫描线算法填充多边形的基本思想是按扫描线顺序,计算扫描线与多边形的相交区间,再⽤要求的颜⾊显⽰这些区间的象素,即完成填充⼯作。
区间的端点可以通过计算扫描线与多边形边界线的交点获得。
如扫描线y=3与多边形的边界相交于4点(2,3)、(4,3)、(7,3)、(9,3)这四个点定义了扫描线从x=2到x=4,从x=7到x=9两个落在多边形内的区间,该区间内像素应取填充⾊。
算法的核⼼是按x递增顺序排列交点的x坐标序列。
由此可得到扫描线算法步骤如下:算法步骤:1.确定多边形所占有的最⼤扫描线数,得到多边形定点的最⼩最⼤值(y min和y max);2.从y min到ymax每次⽤⼀条扫描线进⾏填充;3.对⼀条扫描线填充的过程分为四个步骤:a)求交点;b)把所有交点按递增顺序排序;c)交点配对(第⼀个和第⼆个,第三个和第四个);d)区间填⾊。
描述多边形扫描转换的扫描线算法的基本步骤

描述多边形扫描转换的扫描线算法的基本步骤多边形扫描转换是计算机图形学中一种常用的算法,用于将输入的多边形进行转换和填充。
其基本步骤包括初始化,活性边表的生成,活性边表的更新和扫描线的处理。
1.初始化首先,需要根据输入的多边形构造一个扫描线填充的边表。
这包括对多边形顶点的排序、计算多边形中的水平线交点,并将边表中的数据初始化为初始值。
2.活性边表的生成活性边表是用来存储和管理与扫描线相交的边的数据结构。
生成活性边表的过程包括两个步骤:-遍历多边形的每一条边,将边与当前扫描线的位置进行比较,如果两者相交,则将这条边添加到活性边表中。
-对活性边表中的边按照交点的水平位置进行排序。
这里可以使用插入排序等算法。
3.活性边表的更新活性边表需要在每次扫描线移动时进行更新。
这包括对活性边表中的边进行更新,以反映新的交点或边的状态的变化。
-对于与当前扫描线相交的边,需要计算其交点,并更新到活性边表中。
-对于已经处理完的边或超出当前扫描线范围的边,从活性边表中移除。
4.扫描线的处理在每次扫描线移动时,需要对当前的活性边表进行处理。
这包括两个子步骤:-将活性边表中的边按照两两成对的方式遍历,找到当前扫描线和这两条边所定义的三角形的上顶点和下顶点。
-将这个三角形的内部填充,并进行显示或存储等处理。
5.继续扫描线的移动在处理完一条扫描线后,需要将扫描线的位置向上移动一个单位,并继续执行第3步和第4步,直到所有的扫描线都被处理完毕。
总结:多边形扫描转换的基本步骤包括初始化、活性边表的生成、活性边表的更新和扫描线的处理。
这个算法通常用于实现对多边形的填充。
在每次扫描线移动时,活性边表需要进行更新,以反映新的交点或变化的边的状态。
扫描线的处理包括遍历活性边表中的边,并根据扫描线和这两条边所定义的三角形的顶点来进行填充。
最后,重复执行扫描线的移动和对活性边表的更新和处理,直到所有的扫描线都被处理完毕。
多边形的扫描转换算法

多边形的扫描转换算法概述多边形的扫描转换算法是计算机图形学中用于将多边形转换为像素的常用算法。
它通过扫描线的方式来确定多边形与像素的相交关系,并将多边形的内部区域填充为指定的颜色。
本文将详细介绍多边形的扫描转换算法的原理、步骤和应用。
原理多边形的扫描转换算法基于扫描线的概念,将多边形的边界线与一条水平线或垂直线进行比较,从而确定多边形的内部和外部区域。
算法的关键在于边界线的处理和内部区域的填充。
步骤多边形的扫描转换算法一般包括以下步骤:1.初始化扫描线的位置和内部区域的填充颜色。
2.遍历多边形的边界线,将其与扫描线比较,确定内部和外部区域。
3.根据内部区域的状态,进行填充颜色。
4.更新扫描线的位置,继续扫描下一条线段,直至完成对所有边界线的处理。
算法详解初始化扫描线在开始进行多边形的扫描转换之前,需要初始化扫描线的位置和内部区域的填充颜色。
一般情况下,扫描线的位置可以从多边形的最低点开始,逐渐向上扫描。
内部区域的填充颜色可以根据具体需求进行选择。
边界线处理多边形的边界线可以由多个线段组成,需要按照一定的顺序进行处理。
一种常用的处理方式是按照边界线的上端点的纵坐标从小到大排序,然后依次处理每条线段。
对于每条线段,通过比较线段的上端点和下端点的纵坐标与扫描线的位置,可以确定线段与扫描线的相交关系。
根据线段的斜率可以进一步确定线段与扫描线的交点。
内部区域填充确定了线段与扫描线的相交关系后,就可以确定内部和外部区域。
一般情况下,内部区域被定义为线段上方的区域,而外部区域被定义为线段下方的区域。
根据内部区域的状态,可以进行填充颜色。
如果内部区域是连续的,则可以使用扫描线的颜色进行填充。
如果内部区域有间隙,则需要采用其他填充算法,如边界填充算法或种子填充算法。
更新扫描线处理完当前线段后,需要更新扫描线的位置,继续扫描下一条线段。
一般情况下,扫描线的位置会逐渐向上移动,直至到达多边形的最高点。
应用多边形的扫描转换算法在计算机图形学中有广泛的应用。
计算机图形学_ 光栅图形学算法(一)_24 多边形扫描转换X扫描线算法_

x
d、区间填色:把这些相交区间内的 像素置成不同于背景色的填充色
当扫描线与多边形顶点相交时,交点的取舍问题(交点的个数 应保证为偶数个)
y 12 11 10 9 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 101112 x
解决方案:
y
(1)若共享顶点的两条边分别落
12 11
x
算法的核心是按X递增顺序
排列交点的X坐标序列。由 y P7
此,可得到X-扫描线算法步
12 11
骤如下:
10 9
P6
P5
8
(3)对一条扫描线填充的过
7 6
P1
P3
5
程可分为四个步骤:
4 3
2
a、求交:计算扫描线与多边
1
1 2P23 4 5 6 7 8P4 9 101112 x
形各边的交点
b、排序:把所有交点按递增 顺序进行排序
任意两顶点间的连线均在多边形内
(2)凹多边形 任意两顶点间的连线有不在在多边形内
(3)含内环的多边形 多边形内包含多边形
现在的问题是,知道多边形的边界,如何找到多边形内部 的点,即把多边形内部填上颜色
P2
P3
P4
P1 P6
P5
顶点表示
点阵表示
1、X-扫描线算法
X-扫描线算法填充多边形的基本思想是按扫描线顺序,计算 扫描线与多边形的相交区间,再用要求的颜色显示这些区间 的像素,即完成填充工作
区间的端点可以通过计算扫 描线与多边形边界线的交点 获得
扫描线
交点 交点
交点
交点
如扫描线y=3与多边形的边界相 y
交于4点:
11
计算机图形学二、多边形的扫描转换算法

2
做一个
E
2
A
C C
2
D
B
2
局部极大或局部极小点, 交点看做是二个
非局部极值点,交点看
2
做一个
E
非局部极值点将这些相
邻边分割开来
2
A
如何计算扫描线与多边形边界线的所有交点?
若扫描线yi与多边形边界线交点的x坐标是xi, 则对下一条扫描线yi+l,它与那条边界线的交点的x 坐标xi+1,可如下求出:
m
yi1 yi xi1 xi
, yi1
yi
1
xi 1
xi
1 m
扫描线与多边形边的交点计算 C
B
yk 1 yk
x AC k 1
xkAC
1 mAC
x BC k 1
xkBC
1 mBC
A
活跃(活性)边:与当前扫描线相交的边 活跃(活性)边表AET:存贮当前扫描线相交的各边的表。
ymax x 1/m next
…
扫描线5 扫描线6
e2 92 0
e2 92 0
e6 5 13 6/4 λ
e5 11 13 0 λ
9∧
8∧
e3
e4
7
9 7 -5/2
11 7 6/4 λ
e5
6
11 13 0 λ
5∧
e2
e3
4
9 2 0λ
3∧
e2
2∧
e1
e6
1
3 7 -5/2
5 7 6/4 λ
e1
0∧
ymax xmin 1/m
e4 e5
e6 5 111/2 6/4 λ
9∧
计算机图形学——圆的扫描转换(基本光栅图形算法)

计算机图形学——圆的扫描转换(基本光栅图形算法)与直线的⽣成类似,圆弧⽣成算法的好坏直接影响到绘图的效率。
本篇博客将讨论圆弧⽣成的3个主要算法,正负法、Bresenham 法和圆的多边形迫近法,在介绍算法时,只考虑圆⼼在原点,半径为R的情况。
⼀、正负法1、基本原理假设已选取Pi-1为第i-1个像素,则如果Pi-1在圆内,就要向圆外⽅向⾛⼀步;若已在圆外就要向圆内⾛⼀步。
总之,尽量贴近圆的轮廓线。
2、正负法的具体实现1)圆的表⽰:设圆的圆⼼为(0,0),半径为R,则圆的⽅程为:F(x,y)=x2+y2–R2=0当点(x,y)在圆内时,F(x,y)<0。
当点(x,y)在圆外时,F(x,y)>0。
2)实现步骤第1步:x0=0,y0=R第2步:求得Pi(x i,y i)后找点P i+1的原则为:当P i在圆内时(F(xi,yi)≤0),要向右⾛⼀步得P i+1,这是向圆外⽅向⾛去。
取x i+1= x i+1, y i+1= y i当P i在圆外时(F(xi,yi)>0),要向下⾛⼀步得P i+1,这是向圆内⽅向⾛去,取x i+1= x i, y i+1= y i-1⽤来表⽰圆弧的点均在圆弧附近且 F(xi, yi)时正时负假设已经得到点(x i, y i),则容易算出F(x i, y i),即确定了下⼀个点(x i+1, y i+1),则如何计算F(x i+1, y i+1),以确定下下个点(x i+2, y i+2)?分为两种情况:右⾛⼀步后:x i+1=x i+1,y i+1=y i,此时:F(x i+1, y i+1)=x i+12+y i2-R2=x i2+y i2-R2+2x i+1 = F(x i, y i)+2x i+1下⾛⼀步后:x i+1=x i,y i+1=y i-1, 此时:F(x i+1, y i+1)=x i2+(y i-1)2-R2= F(x i, y i)-2y i+1由此可得:确定了F(xi+1, yi+1)之后,即可决定下⼀个点(xi+2, yi+2),选择道理同上。
计算机图形学_基本算法

应不同的设备。
12
返回
2
Ø曲线也可由直线段逼近生成 Ø解决的问题:给定直线两端点P0(x0,y0)
和P1(x1,y1),画出该直线。 主要步骤可以表示如下:
13
初值
偏差判别
移动绘图 偏差计算
终点 判断
N
Y 结束
图2-2 一般线段绘制过程的主要步骤示意图
• 偏差判别:根据当前绘图点位置与理想位置的偏差情况,确定
在不考虑线宽时,一维图形的扫描转 换主要是确定一维的像素序列,二维图 形的扫描转换是确定平面区域所对应的 像素集(称为区域填充)。
5
Ø 一般微机系统板上都配有图形显示缓冲区,
为了快速、及时地控制图形的输出,系统在基
本内存中开辟了从
A0000H ~ CFFFFH的256K字节
甚至到FFFFFH的512K字节
29
返回
因递推公式: Xi+1=Xi+1 yi+1 = kxi+1+b= k1xi+b+k∆x= yi+k∆x
所以:当 ∆x =1; yi+1 = yi+k。 即当x每递增1,y递增k(即直线斜率)
y
yi+1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
y0 kx0 b 0
则:
d 0 0.5 k
(3-6)
说明:
由于使用的是di的符号,可以用2di△x代替
di来摆脱小数,使得算法只涉及整数运算。
——孙家广《计算机图形学(第3版)》。
现有的研究已经证明:端点采用整数坐标没 有什么益处,因为现在的CPU可以按照与处理整 数同样的速度处理浮点数。因此本课程中使用的 中点Bresenham算法采用了浮点数运算并且方便 解决了直线的反走样问题。
BOOL SetPixelV(int x, int y, COLORREF crColor);
直线、圆、椭圆的扫描转换主要使用Bresenham算法实现。
Bresenham算法最初是为数字绘图仪提出,但同样适用于光栅显示 器。
Jack Elton Bresenham
Plotter movement
红绿两段直线连结点处的颜色应该是 红色还是蓝色?连结点像素要求不绘 制两次。
Bresenham算法的特点: •Bresenham 算法是一个经典的增量算法。在一个迭代算法中,如果每一 步的x,y值是用前一步的值加上一个增量来获得的,那么这种算法就称为 增量算法。 •Bresenham 算 法 有 几 种 变 体 , 计 算 方 法 略 有 不 同 。 本 章 只 介 绍 中 点 Bresenham算法(Midpoint Bresenham Algorithm)。
void CTestView::BresenhamLine(CDC *pDC) { CPoint p0(-100,-50),p1(200,50),p; int dx,dy; dx=p1.x-p0.x; dy=p1.y-p0.y; double k,d; k=(double)dy/dx; d=0.5-k; for(p=p0;p.x<p1.x;p.x++)//不包括终点(x1,y1) { pDC->SetPixelV(p,RGB(0,0,0)); if(d<0) { p.y++; d+=1-k; } else d-=k; } }
颜色渐变直线
void CTestView::CLine(CDC *pDC) { CPoint p0(-100,-50),p1(200,50),p; int dx=p1.x-p0.x,dy=p1.y-p0.y; double k,d; k=(double)dy/dx; d=0.5-k; double dc=1/(double)dx; for(p=p0;p.x<p1.x;p.x++)//不包括终点p1 { double r,g,b; r=(1-(p.x-p0.x)*dc),g=0,b=(p.x-p0.x)*dc; pDC->SetPixelV(p,RGB(r*255,g*255,b*255)); if(d<0) { p.y++; d+=1-k; } else d-=k; } }
3.1.4 绘制任意斜率的直线
k =-1 k<-1 |k|=∞ k>1 k =1
-1≤k<0
0≤k≤1 k =0
0≤k≤1
-1≤k<0
k>-1
k<-1
直线斜率的对称性
任意斜率的直线
3.1.4 颜色渐变直线
绘制光滑过渡的彩色直线段时,需要使用公式(3-28)进行前 景色线性插值 c=(1-t)c0+tc1 (3-28) 式中,c为颜色渐变直线段上任一点的颜色; c0为直线段起点 的颜色;c1为直线段终点的颜色。
例:从(20,10)到(30,18),画直线.
i xi yi pi i xi yi pi
0
1 2 3 4 5
20
21 22 23 24 25
10
11 12 12 13 14
6
2 -2 14 10 6
6
7 8 9 10
26
27 28 29 30
15
16 16 17 18
2
-2 14 10
思考:K>1时如何画线?
3.1 直线的扫描转换
直线的扫描转换是在屏幕像素点阵中确定最佳逼近于理想直线的像素 点集的过程。计算机图形学要求直线的绘制速度要快,即尽量使用加减法 (增量算法),避免乘、除、开方、三角等复杂运算。最著名的算法是由 J.E. Bresenham于1965年提出的Bresenham算法。
y
O
直线的扫描转换
从Pi(xi,yi)点出发选取下一像素时,需将Pu和Pd的中点M(x i+1,y i+ 0.5)代入隐函数方程,构造中点误差项di 。
d i F ( xi 1, yi 0.5) yi 0.5 k ( xi 1) b(3-2)
yi 1
yi 1 , yi ,
第二章
本章内容
3.1 3.2 3.3 3.4 3.6
直线的扫描转换 直线的Wu反走样算法 圆的扫描转换 椭圆的扫描转换(自学) 本章小结
直线、圆、椭圆是二维场景中的最基本图形。尽管MFC的CDC类已 经提供了相关的绘制函数,但直接使用这些函数仍然无法满足真实感图形 绘制的要求。光栅扫描显示器是画点设备,基本图形的光栅化就是在像素 点阵中确定最佳逼近于理想图形的像素点集,并用指定颜色显示这些像素 点集的过程。当光栅化与按扫描线顺序绘制图形的过程结合在一起时,也 称为扫描转换。本章从基本图形的生成原理出发,使用绘制像素点函数实 现基本图形的扫描转换。绘制像素点函数的原型为
3.2 反走样技术
直线扫描转换算法在处理非水平、非垂直且非45°的直线段时会出现 锯齿,这是因为直线段在光栅扫描显示器上显示的图像是由一系列亮度相 同而面积不为零的离散像素点构成的。这种由离散量表示连续量而引起的 失真称为走样(aliasing)。用于减轻走样现象的技术称为反走样(antialiasing,AA)或者抗锯齿。走样是理想直线(理想直线宽度为零)扫描转 换后(真实像素点面积不为零)的必然结果。走样是光栅扫描显示器的一
0≤k≤1的Bresenham算法:
(1)输入直线段的两个端点坐标P0(x0,y0),P1(x1,y1)。 (2)计算△x=x1-x0,△y=y1-y0,k= △y/△x , d=0.5-k。 (3)绘制点P(x,y),判断d的符号。如果d<0,则P(x,y) 点更新为P(x+1,y+1),d更新为d+1-k;否则,P(x,y)点更 新为P(x+1,y),d更新为d-k。 (4)当P点的x坐标小于P1点的x坐标时,重复步骤(3), 否则结束程序 。
光照线框球
光栅扫描显示器的本质决定它难以生成完美的直线段,也不能保证直 线段精确地通过起点和终点。绘制直线段的基本要求: •直线要直。要求具有精确的起点和终点。 •直线无方向性。从起点绘制到终点的直线段与从终点绘制到起点的直线 段要重合。 •直线的绘制速度要快。即尽量使用加减法整数运算,避免乘、除、开方、 三角等复杂运算。但随着计算机处理浮点数与整数的速度趋于一致,这点 要求在减弱。 •MSDN:Draws a line from the current position up to, but not including, the point specified by x and y (or point). The line is drawn with the selected pen. The current position is set to x,y or to point.
(3-4)
⑵当di≥0,时下一步的中点坐标为M(xi+2, yi+0.5),下一步中点误差项为
di 1 F ( xi 2, yi 0.5) yi 0.5 k ( xi 2) b yi 0.5 k ( xi 1) b k di k
(3-5)
显示器的分辨率提高一倍的效果图
软件反走样技术主要是加权区域采样。算法的实质是利用人眼视觉特 性,通过加权平均的方法,调节像素的亮度和灰度,以产生模糊的边界, 从而达到较好的视觉效果以消除 “锯齿”。加权参数可以选择距离、面 积和体积等。下面主要讲解直线的距离加权反走样算法,关于面积加权 和体积加权反走样算法请参考相关文献。
•对于直线,中点 Bresenham 算法与 Bresenham 算法产生同样的像素点,
而且还可以扩展为更复杂的图形扫描转换算法,如绘制圆的中点 Bresenham算法和绘制椭圆的中点Bresenham算法。
3.1.1 算法原理
直线的中点Bresenham算法的原理:每次在主位移
方向上走一步,另一个方向上走不走步取决于中点误 差项的值。
(1)当di<0时,下一步的中点坐标为M(xi+2, yi+1.5),下一步中点误差项为
di 1 F ( xi 2, yi 1.5) yi 1.5 k ( xi 2) b
yi 0.5 k ( xi 1) b 1 k
di 1 k
种固有现象,不可避免,只能减轻。
不走样直线
走样直线
未开抗锯齿
开启抗锯齿
“画图”绘制的斜线
“word”绘制的斜线
反走样技术主要分为两类:一类是硬件技术,通过提高显示器的分 辨率来实现;另一类是软件技术,通过改进软件算法来实现。 从硬件角度把显示器的分辩率提高了一倍。由于每个锯齿在x方向 和y方向都只有原先分辨率的一半,所以看上去走样现象有所改善。虽 然如此,硬件反走样技术由于受到硬件条件和成本的限制,实现起来较 为困难,很难达到理想的反走样效果。
直线的中点Bresenham算法小结: 1. 确定主位移方向。在主位移方向上每次加1,另一个方 向上加不加1,取决于中点误差项。 2. 计算d的初始值。 3. 区分di <0与di≥0两种情况,分别计算di的递推公式。