<4> 边缘填充算法
根据余数的性质,即对M 作偶数次求余运算,其结果是M;而对M作奇数次求余运算的结果是/M。在光栅图形中,如某区域已着上值为M的某种颜色,对M作偶数次求余运算后,该区域颜色不变;而作奇数次求余运算后,该区域颜色则变为值为/M的颜色。具体算法为:先求出包含该多边形的最小矩形;对每边的右边的点做求余填充。程序中取A=RGB(255,255,255),由于背景色是白色,所以M=RGB(255,255,255);根据奇偶规则易知:在多边形内的点被填充了奇数次,所得颜色为:
/M=A-M=(0,0,0)即黑色,而对多边形外的点被填充的偶数次,颜色为M,即白色,还是背景色。具体代码见:函数void EdgeFill(POINT point[], int len);
注意事项:在理想情况下,该方法是能很好工作的。但由于计算机显示出的点是离散化的,会出现一些异常。比如说:如果直线斜率不为0,理论上不会有两个不同点的纵坐标Y相同,但屏幕显示时确有可能出现这样的情况,在这种情况下,如果直接使用上述算法,会出现问题。我是这样处理的:为了保证不会出现上面的情况,强制一条直线与扫描线有最多只有一个交点,当出现多个时,不同点的纵坐标Y相同时,只对较左的一点着上边界标志色;这样可以保证一条直线与扫描线最多只有一个交点。另一种异常是:当多边形的角很尖时,有可能使相邻两边的部分点重合在一起,这样读点时只能读到一次边界标志色,如再使用奇偶规则,会导致多边形外面的点被着色。我是这样处理的:对边着边界标志色时,先对其判断,如果该点已是边界色了,就对该点着上填充色。这样便可解决上述问题。但对于某些图形,还有会有个别异常,有待进一步调试。
六、测试范例:
程序效果截图:

七、实习体会:
我的程序使用VC作为开发环境,计算机图形学的算法设计主要涉及到的类为CDC类,即画图类,VC很好的封装了一些画图的函数与算法,当然,在上机的过程中我们主要是实现图形学的算法,因此我们可以完全自己根据算法设计自己的函数来实现画点画线的功能。然后利用VC给我们提供的良好的程序界面和友好的消息机制,完成自己的应用程序。
上述几种填充算法,对于简单图形利用其对称性,这种方法有比较大的局限性;逐点判断法计算量比较大,比较慢,但方法比较简单,填充的图形类型比较多,;扫描线算法比较快,适合用软件实现,但算法比较复杂,对于有边相交的情况,有可能出现异常。边缘填充,比较慢,对同一点有很多重复操作,方法简单;边界标志法,比较快,特别适合用硬件实现,方法思想很简单,但细节比较多,要用到一些技巧。