x)/(spt[i+1].y-spt[i].y); if(spt[i].y<=spt[i+1].y){ edge[i].num=i; edge[i].ymin=spt[i].y; edge[i].ymax=spt[i+1].y; edge[i].xmin=(float)spt[i].x; edge[i].xmax=(float)spt[i+1].x; pmax=spt[i+1].y; pmin=spt[i].y; } else{
edge[i].num=i;
edge[i].ymin=spt[i+1].y; edge[i].ymax=spt[i].y; edge[i].xmax=(float)spt[i].x; edge[i].xmin=(float)spt[i+1].x; pmax=spt[i].y; pmin=spt[i+1].y; } }
for(int r=1;r<6;r++) //排序edge(yUpper,xIntersect) {
for(int q=0;q<6-r;q++) {
if(edge[q].ymin newedge[0]=edge[q]; edge[q]=edge[q+1]; edge[q+1]=newedge[0]; } } } for(int scan=pmax-1;scan>pmin+1;scan--) { int b=0; k=s; for(j=k;j<6;j++) { if((scan>edge[j].ymin)&&(scan<=edge[j].ymax))//判断与线段相交 { if(scan==edge[j].ymax) { if(spt[edge[j].num+1].y p[b]=(int)edge[j].xmax; } if(spt[edge[j].num-1].y p[b]=(int)edge[j].xmax; } } if((scan>edge[j].ymin)&&(scan p[b]=(int)(edge[j].xmax+edge[j].dx*(scan-edge[j]. ymax)); } } //pDC->LineTo(spt[edge[0].num].x,spt[edge[0].num].y); if(scan<=edge[j].ymin)// s=j; } if(b>1) { for(int u=1;u pDC->MoveTo(p[u]+3,scan); u++; pDC->LineTo(p[u],scan); } } } pDC->SelectObject(old); } 说明:双击,出现需填充的多边形,单击相关功能菜单实现区域填充。 void CMyView::OnSeedfill() //种子算法进行多边形区域填充,如图1-20所示 { CWindowDC dc (this); int fill=RGB(0,255,0); int boundary=RGB(255,0,0); CPoint pt=s_point; int x,y,p0,pmin,pmax; //求多边形的最大最小值 for(int m=1;m<7;m++) { for(int n=0;n<7-m;n++) { if(spt[n].y p0=spt[n].y; spt[n]=spt[n+1]; spt[n+1]=p0; } } } pmax=spt[0].y,pmin=spt[6].y; x=s_point.x; y=s_point.y; for(;y int current=dc.GetPixel(x,y); while((current!=boundary)&&(current!=fill)) { dc.SetPixel(x,y,fill); x++; current=dc.GetPixel(x,y); } x=s_point.x; x--; current=dc.GetPixel(x,y); while((current!=boundary)&&(current!=fill)) { dc.SetPixel(x,y,fill); x--; current=dc.GetPixel(x,y); } x=s_point.x; } x=s_point.x; y=s_point.y-1; for(;y>pmin-2;y--) { int current=dc.GetPixel(x,y); while((current!=boundary)&&(current!=fill)) { dc.SetPixel(x,y,fill); x++; current=dc.GetPixel(x,y); } x=s_point.x; x--; current=dc.GetPixel(x,y); while((current!=boundary)&&(current!=fill)) { dc.SetPixel(x,y,fill); x--; current=dc.GetPixel(x,y); } x=s_point.x; } } 说明: (1)双击后,出现需填充的多边形,单击相关功能菜单实现区域填充。 (2)进行种子填充,需右击多边形内一点,作为开始填充的种子点。 void CMyView::OnLButtonDblClk(UINT nFlags, CPoint point) { RedrawWindow(); CDC* pDC=GetDC(); CPen newpen(PS_SOLID,1,RGB(255,0,0)); CPen *old=pDC->SelectObject(&newpen); spt[0]=CPoint(100,100); //绘制多边形区域 spt[1]=CPoint(300,100); spt[2]=CPoint(250,250); spt[3]=CPoint(100,250); spt[4]=CPoint(150,200); spt[5]=CPoint(90,180); spt[6]=CPoint(150,150); spt[7]=CPoint(100,100); pDC->Polyline(spt,8); pDC->SelectObject(old); ReleaseDC(pDC); CView::OnLButtonDblClk(nFlags, point); } void CMyView::OnRButtonDown(UINT nFlags, CPoint point) { s_point=point; //选择种子点 CView::OnRButtonDown(nFlags, point); } 1.5 字符的生成 字符指数字、字母、汉字等符号。计算机中字符由一个数字编码惟一标识。国际上最流行的字符集是《美国信息交换用标准代码集》,简称ASCII码。它是用7位二进制数进行编码表示128个字符,包括字母、标点、运算符以及一些特殊符号。我国除采用ASCII码外,还另外制定了汉字编码的国家标准字符集GB 2312-1980《信息交换用汉字编码字符集 基本集》。该字符集分为94个区,94个位,每个符号由一个区码和一个位码共同标识。区码和位码各用一个字节表示。为了能够区分ASCII码与汉字编码,采用字节的最高位来标识:最高位为0表示ASCII码;最高位为1表示汉字编码。为了在显示器等输出设备上输出字符,系统中必须装备有相应的字库。字库中存储了每个字符的形状信息,字库分为矢量和点阵型两种形式,如图1-21所示。 (a)点阵字符 (b)点阵字库中的位图表示 (c)矢量轮廓字符 图1-21 字符的种类 1.5.1 点阵字符 在点阵字符库中,每个字符由一个位图表示。该位为1表示字符的笔画经过此位,对应于此位的像素应置为字符颜色。该位为0表示字符的笔画不经过此位,对应于 此位的像