赞
踩
我们可以使用单一颜色或一个颜色图案来填充不规则区域。对于图案填充来说,如9节讨论的那样重叠一个颜色掩模。在处理区域中的每一个像素时,其颜色由对应的重叠掩模中的值来确定。
13.1边界填充算法
假如边界是以单一颜色指定的,则填充算法可逐个像素地向外处理,直至遇到边界颜色。这种方法称为边界填充算法(boundary-fill algorithm ),用于比较容易地指定内点交互式绘画软件。艺术家或设计师可以使用图形板或其他交互设备来勾勒图形的轮廓,从颜色菜单中选择一个填充色,指定一种边界色,并选择一个内部点。然后在图形的内部涂上填充色。内边界和外边界可以一起用来定义边界填充的区域,图4.26给出了指定颜色范围的例子。
- void boundaryFill4(int x, int y, int fillColor, int borderColor){
- int interiorColor;
-
- /*Set current color to fillColor, then perform following operations*/
- getPixel (x, y, interiorColor);
- if ((interiorColor != borderColor) && (interiorColor != fillColor)) {
- setPixel (x, y); // Set color of pixel to fillColor.
- boundaryFill4 (x + 1, y, fillColor, borderColor);
- boundaryFill4 (x - 1, y, fillColor, borderColor);
- boundaryFill4 (x, y + 1, fillColor, borderColor);
- boundaryFill4 (x, y - 1, fillColor, borderColor);
- }
- }
假如有些内部像素已经以填充颜色显示,则递归式的边界填充算法也许不能正确地填充区域。这是因为算法既按边界颜色又按填充颜色来检测下一个像素。
遇到一个具有填充颜色的像素将导致该递归分支终止,从而留下一些尚未填充的内部像素。
为了避免这种情况,可在应用边界填充程序前,将那些初始颜色改为填充颜色的内部像素的颜色。
1和2进栈;在图4.29(b)中,从堆栈中取出位置2并生成填充区段,然后将下一个扫描线上单个区段的起始像素(位置3)放进堆栈。在处理完位置3后,填充过的区段和进栈的位置如图4.29(c)所示。图4.29(d)给出了在处理指定区域右上角的所有区段后的已填充像素。接着处理位置5,并且对区域的左上角填充,然后取出位置4继续对较低的扫描线进行处理。
- void boundaryFill4(int x, int y, int fillColor, int interiorColor){
- int color;
-
- /*Set current color to fillColor, then perform following operations. */
- getPixel (x, y, color);
- if ((color != interiorColor){
- setPixel (x, y); // Set color of pixel to fillColor.
- boundaryFill4 (x + 1, y, fillColor, interiorColor);
- boundaryFill4 (x - 1, y, fillColor, interiorColor);
- boundaryFill4 (x, y + 1, fillColor, interiorColor);
- boundaryFill4 (x, y - 1, fillColor, interiorColor);
- }
- }
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。