边缘填充算法

来源:互联网 发布:windows xp是什么意思 编辑:程序博客网 时间:2024/05/22 05:32

多边形的区域填充:边缘填充算法

边缘填充算法的基本思想是,逐边向右求补。可以按任意顺序处理多边形的每条边,在处理每条边时,首先求出该边与扫描线的交点,然后将每一条扫描线上交点右方的所有像素取补,多边形的所有边处理完毕之后,填充即完成

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<conio.h>#include<graphics.h>#define N 100000#define Min -99999999int n;//点的个数int right;//图像的右边界struct point  //点的坐标{    int x;int y;}point[N];void init()  //顺序输入点的坐标{int i;    printf("请输入点的个数: ");scanf("%d",&n);right=Min;for(i=0;i<n;i++){scanf("%d %d",&point[i].x,&point[i].y);        if(point[i].x>right)right=point[i].x;}point[n].x=point[0].x; //首位相接point[n].y=point[0].y;}void DDA(int x0,int y0,int x1,int y1)//用于绘制直线{int dx,dy,eps1,k;float x,y,xIncre,yIncre;int p,q;dx=x1-x0;dy=y1-y0;x=x0;y=y0;if(abs(dx)>abs(dy))eps1=abs(dx);elseeps1=abs(dy);xIncre=(float)dx/(float)eps1;    yIncre=(float)dy/(float)eps1;for(k=0;k<=eps1;k++){p=(int)(x+0.5);q=(int)(y+0.5);if(getpixel(p,q)==BLUE)  //背景色为蓝色,填充色为红色putpixel(p,q,RED);elseputpixel(p,q,BLUE);x+=xIncre;y+=yIncre;}}void sol1()//绘制该多边形的外轮廓{int i;int x0,y0,x1,y1;setbkcolor(BLUE);cleardevice();setcolor(RED);for(i=0;i<n;i++){        x0=point[i].x;y0=point[i].y;x1=point[i+1].x;y1=point[i+1].y;line(x0,y0,x1,y1);}}void sol2()//边缘填充算法{int x0,y0,x1,y1,i;int dx,dy,eps1,k;int p,q;int flag;int temp;float x,y,xIncre,yIncre;for(i=0;i<n;i++){x0=point[i].x;y0=point[i].y;x1=point[i+1].x;y1=point[i+1].y;if(y0>y1) //保证(x0,y0)在(x1,y1)的下面{temp=y0;y0=y1;y1=temp;            temp=x0;x0=x1;x1=temp;}dx=x1-x0;    dy=y1-y0;    x=x0;    y=y0;//注意这里和DDA算法不同,yIncre=1    //if(abs(dx)>abs(dy))    //eps1=abs(dx);    //else    eps1=abs(dy);    xIncre=(float)dx/(float)eps1;        yIncre=(float)dy/(float)eps1;flag=1;    for(k=0;k<=eps1;k++){p=(int)(x+0.5);    q=(int)(y+0.5);//每条直线的上端点不处理,避免交点处处理两次,没达到填充的效果if(k!=0)DDA(p,q,right,q);x+=xIncre;    y+=yIncre;}}}int main(){init();initgraph(500,500);sol1();sol2();getch();    closegraph();return 0;}

附个测试数据和截图

请输入点的个数: 7

10 70

30 10

60 50

80 10

120 90

70 80

30 120