1、多边形区域填充图案(一)不透明方式填充1.1.1 实验目的通过本次实验,使学生掌握如何生成一个二值图案以及将 该图案填充到对多边形区域中去。并能够较熟练使用 VC 编程实现。 1.1.2 实验内容1)绘制一个多边形区域 2)生成一个二值图案。 2)将一个生成好的 图案填充到多边形区域中去。1.1.3 实验原理在进行图案填充时,必须要确定区域与 图案之间的位置关系。这可以通过把图案原点与图形区中的某一点对齐的办法实现。对齐方法一般有两种:1)将图案原点与区域边界或内部某一点对齐。2)将图案原点与填充区域外部的某一点对齐。假设图案是一个 MN 的位图,用一个二维数组存放。 int patternM
2、N;为讨论方便,设填充区域为矩形区域,其左下角点的坐标为(x0,y0)。由于 图案应比区域小得多,所以我 们总可以将其设计成周期性的出现。假 设当前扫描线与填充区域的相交区 间上一象素坐标为(x,y)。1)在第一种对齐方式下,我们 可以用如下代码实现:m=(x-x0)%N;n=(y-y0)%M;if(patternmn)=1)putpixel(x,y,color);2)在第二种对齐方式下,我们 可以用如下代码实现:m=x%N;n=y%M;if(patternmn)=1)putpixel(x,y,color);注:1)因为填充区域本身的复杂性,所以从算法的复 杂性方面看,第二种对齐方式比第一种对
3、齐方式要简单。2)第一种对齐方式填充的图案,当填充区域移 动时也会一道移 动,看起来很自然;而第二种对齐方式就没有这个优点。3)在对相邻区域用同一种图案进行填充时,用第二种 对齐 方式可以做到无缝连接的效果。而第一种对齐方式则没有 这样的优点。区域填充图案有透明方式和非透明方式两种。透明方式可用如下代码实现:m=x%N;n=y%M;if(patternmn)=1)putpixel(x,y,color);而非透明方式可用如下代码实现:m=x%N;n=y%M;if(patternmn)=1)putpixel(x,y,color);else putpixel(x,y,bkcolor);1.4.4 实
4、验主要步骤(假设工程名为 bitfill.dsw)1、 打开头文件 bitfillview.h,在 CbitfillView 类中添加成员 数组。2、 打开 bitfillview.cpp 文件,在构造函数 CbitfillView( )中对数组 a 进行初始化从而生成一个二值位图。3、 在成员函数 OnDraw( )中添加代码。 实现按某一种方式填充。1.4.5 主要代码:1、 在文件 bitfillView.cpp 中定义如下外部数组。int a88=0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,1,1,1,1,0,0,0,1,0,0,1,0,0,0,0,1,
5、0,0,1,0,0,0,1,1,1,1,1,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0;2、 在成员函数 OnDraw( )中添加如下代码。int x,y,m,n;CPen p;p.CreatePen(PS_SOLID,2,RGB(100,100,100);CPen *poldpen=pDC-SelectObject(CBrush b;b.CreateSolidBrush(RGB(0,0,255);CBrush *poldbrush=pDC-SelectObject(pDC-Rectangle(100,100,300,300);pDC-Ellipse(150,150,350,350);for(y=101;ySetPixel(point,RGB(255,0,0);elsepDC-SetPixel(point,RGB(255,255,255);编译运行,结果如下。不透明方式填充