要求掌握直线、圆弧、区域的扫描转换方法,并能够编程实现。
直线的扫描转换:
(1)基础:
一个像素占有一个有限大小面积的区域
将像素的几何形状看作中心在所给定像素位置的圆点。
确定一个最佳逼近于所显示图形的像素集合,并用指定属性(如颜色)写像素的过程称为图形的扫描转换或生成,也称光栅化。
直线的扫描转换的要求:
①所绘直线要直。
②沿着线段分步的像素应均匀且连续,不出现断裂
③生成速度快
(2)数值微分法:基于直线的微分方程生成直线的方法(DDA)
DDA算法描述:直线段L(P0,P1)的两端点坐标为P0(x0,y0)和P1(x1,y1),直线的微分方程:dx/dy=(x1-x0)/(y1-y0)=k
通过在当前位置(xi,yi)上分别加上增量x和y来求出下一点的坐标。
①通过由x方向增量引起y的改变来生成直线
②通过由y方向增量引起x的改变来生成直线
DDA算法原理
当x1-x0绝对值比较大,以x方向为步进方向,且每步增量为单位步长(x增量=1,即一个像素),计算y方向的增量(y增量=k),把每次计算得出的(xi,yi)经取整后送到显示器输出,则得到扫描转换后的直线。
当x1-x0绝对值比较大时,类似,x方向增量=1/k。
DDA算法步骤
①已知直线的两端点坐标
②已知画线颜色
③计算两个方向的变化量:dx=x1-x0;dy=y1-y0
④根据两个方向变化量绝对值的最大值求出步进次数:steps=max(|dx|,|dy|)
⑤根据步进方向计算两个方向的增量:xincre=dx/steps;yincre=dy/steps
⑥设置初始像素坐标:x=x0,y=y0
⑦用循环确定沿线段下一像素位置,实现绘制。
(3)中点画线算法
通过在每列像素中确定与理想直线最佳逼近的像素来进行扫描转换
算法描述:
给定直线段L(P0,P1)的两端点坐标,假定该直线的斜率为k,且0≤k≤1,x0<x1,直线方程为:F(x,y)=axby+c=0
a=y0-y1, b=x1-x0, c=x0y1-x1y0
中点画线算法原理
用中点M的函数值F(M)作为决策变量di,根据di的符号确定下一个像素的选取。
算法步骤
①已知直线的两端点坐标,条件0≤k≤1且x0<x1
②已知画线颜色
③计算直线方程的两个系数a、b:a=y0-y1;b=x1-x0
④根据a、b计算决策变量初始值d=2a+b,di≥0时的增量delta1=2a,di<0时的增量delta2=(a+b)
⑤设置初始像素坐标:x=x0,y=y0
⑥用循环确定沿线段下一像素位置,实现直线的绘制。
ps:d<0时,y++
(4)Bresenham画线算法
通过在每列像素中选择与理想直线最佳逼近的像素来完成扫描转换。
算法描述:
设给定直线段L的两端点坐标,假定该直线的斜率为k,且0≤k≤1,x0<x1。在这种情况下,从线段左端点P0开始,在每步x方向向右步进一个像素的像素列中确定与直线接近的像素。
假设当前已确定与直线最近的像素坐标为Pi,设Q为理想直线与垂直线x=xi+1的交点,现在要确定在列xi+1=xi+1与直线最近的像素是正右方像素还是右上方像素。
设d1=|PrbQ|,d2=|QPru|,则:
算法步骤:
①已知直线的两端点坐标,条件0≤k≤1且x0<x1
②已知画线颜色
③计算常量x增量,y增量,delta1=2*y增量和delta2=2*y增量-2*x增量,并计算初始决策参数d0=2*y增量-x增量
④设置初始像素坐标:x=x0,y=y0
⑤用循环确定沿线段下一像素位置,实现绘制。
ps:d>0时,y++
圆和椭圆的扫描转换
(1)中点画圆算法
在一个方向上单位步长步进,在另一个方向根据两个候选像素的中点与理想圆的关系来确定选择哪个像素
算法描述:
考虑中心在圆点,半径为R的圆的第二个八分圆,圆函数
算法步骤:
①输入圆心坐标,圆的半径,画线颜色
②计算初始值x=0,y=R,d=1-R
③绘制点(x,y)及所对应的另外7个对称点
④判断d的符号,若d<0,则先将d更新为d+2x+3,再将x更新为x+1;否则将d更新为d+2(x-y)+5,再将x更新为x+1,y更新为y-1
⑤当x≤y时,重复③和④,否则结束。
(2)Bresenham画圆算法步骤:
区域填充
(1)区域的表示及类型
顶点表示:是用多边形的顶点序列来表示区域。直观、几何意义强、占内存少、易于几何转换。没有明确指出哪些像素在多边形内。
点阵表示:用位于多边形内的像素集合来表示。丢失了几何信息,便于填充显示。内点表示和边界表示。
区域连通性:分为四连通区域和八连通区域
四连通区域:指从区域内某一点出发,可通过上下左右4个方向移动,在不越出区域的前提下到达区域内任意像素。
八连通区域:指从区域内某一点出发,可通过上下左右,左上右上左下右下8个方向移动,在不越出区域的前提下到达区域内任意像素。
扫描线多边形填充算法: