图案填充:在确定了区域内一个像素之后,不应立刻向该像素填色,而是先查询图案位图的对应位置,来判断如何填充。
图案填充方式
透明方式:当图案位图的对应位置为1时,用前景色写像素;否则(为0时),不改变该像素的颜色值。不透明方式:当图案位图的对应位置为1时,用前景色写像素;否则(为0时),用背景色写像素。
图案填充方法——对齐方法
第一种对齐方法:基本思想:把图案原点与填充区域边界或内部的某点对齐。
特点:填充的图案将随着区域的移动而跟着移动,看起来自然。但算法复杂性高。
区域点的选择:多边形可取区域边界上最左边的顶点,圆和椭圆最好取区域内部某一点(如中心)对应图案原点。
第二种对齐方法:
基本思想:把图案原点与填充区域外部的某点对齐。
特点:算法简单。但当区域移动时,图案不会跟着移动,其结果是区域内的图案变了。
第二种对齐方法的算法步骤:
步骤1:定义图案模型
区域内部填充的图案通常是由一个较小的单独图案在水平和垂直方向上周期性排列而构成的。因此,在图案填充之前要首先定义这个较小的单独图案模型。
图案模型是一个大小为M×N的点阵,用M×N的二维数组存放。M、N一般比要填充的区域的尺寸小得多。
图案模型定义实例:一个8×8的图案模型
int pattern[8][8]=
{{0,0,0,1,0,0,0,1}, {0,0,0,1,0,0,0,1},
{0,0,0,1,0,0,0,1}, {0,0,0,1,1,1,1,1},
{0,0,0,1,0,0,0,1}, {0,0,0,1,0,0,0,1},
{0,0,0,1,0,0,0,1}, {1,1,1,1,0,0,0,1}};
步骤2:建立图案模型和区域之间的映射关系
当需要填充的区域与当前扫描线的相交区间确定之后,假设相交区间上一像素坐标为(x, y),则它在图案模型上的对应位置为(x mod M, y mod N),即:
u = x mod M
v = y mod N
x,y为区域内像素坐标;u,v是图案模型上的对应位置;mod为取模运算(可用C语言中的整除取余运算符%实现)。
步骤3:填充图案
①若采用不透明方式填充图案,则应把算法中用前景色color写像素的操作putpixel(x, y, color),改为当图案值为1时,用前景色color写,否则(为0时),用背景色bkcolor写:
if (pattern[x%M][y%N])
putpixel(x, y, color);
else
putpixel(x, y, bkcolor);
②若采用透明方式填充图案,去掉else分句即可。