Graphics—边缘填充算法

来源:互联网 发布:免费数据库同步软件 编辑:程序博客网 时间:2024/06/06 01:45
/*多边形的区域填充:边缘填充算法边缘填充算法的基本思想是,逐边向右求补。可以按任意顺序处理多边形的每条边,在处理每条边时,首先求出该边与扫描线的交点,然后将每一条扫描线上交点右方的所有像素取补,多边形的所有边处理完毕之后,填充即完成*/#include"stdafx.h"#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 display()          //绘制该多边形的轮廓{    int i;    setbkcolor(WHITE);      cleardevice();    setcolor(RED);        for(i=0;i<n;i++)    //画边界线        line(point[i].x,point[i].y,point[i+1].x,point[i+1].y);}void fill()            //边缘填充算法{    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++)    {        //如果线段是水平线或者是右边边界,只画线,不做处理        if(point[i+1].y==point[i].y||(right==point[i+1].x&&right==point[i].x))            line(point[i].x,point[i].y,point[i+1].x,point[i+1].y);        else{            //初始化各个参数            x=point[i+1].x;            y=point[i+1].y;            dx=point[i].x-point[i+1].x;            dy=point[i].y-point[i+1].y;            //扫描线的范围            eps1=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);                //扫描线上取补for(int j=p;j<=right;j++)    {                  //如果当前点为白色,就填充红色if(getpixel(j,q)==WHITE)putpixel(j,q,RED);                  //否则就填充白色elseputpixel(j,q,WHITE);}x+=xIncre;y+=yIncre;}        }    }}int main(){    init();    initgraph(800,700);    display();    fill();    getch();    closegraph();    return 0;}/*100 100700 100700 500600 400400 600300 200200 300*/

运行结果:

//边缘填充算法#include"stdafx.h"#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<conio.h>#include<graphics.h>#define N 100000#define Min -99999999int right;     //图像的右边界struct point   //点的坐标{    int x;    int y;}point[N];void init()   //初始化{    int i;    right=Min;point[0].x=100;point[0].y=100;point[1].x=700;point[1].y=100;point[2].x=700;point[2].y=500;point[3].x=600;point[3].y=400;point[4].x=400;point[4].y=600;point[5].x=300;point[5].y=200;point[6].x=200;point[6].y=300;    for(i=0;i<7;i++)    {        if(point[i].x>right)  //得到右边界right=point[i].x;    }    point[7].x=point[0].x;    //首尾相连,构成封闭图形    point[7].y=point[0].y;}void display()          //绘制该多边形的轮廓{    int i;    setbkcolor(WHITE);      cleardevice();    setcolor(RED);        for(i=0;i<7;i++)           line(point[i].x,point[i].y,point[i+1].x,point[i+1].y);}void fill()            //边缘填充算法{    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<7;i++)    {        if(point[i+1].y==point[i].y||(right==point[i+1].x&&right==point[i].x))            line(point[i].x,point[i].y,point[i+1].x,point[i+1].y);        else{            x=point[i+1].x;            y=point[i+1].y;            dx=point[i].x-point[i+1].x;            dy=point[i].y-point[i+1].y;            eps1=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);                for(int j=p;j<=right;j++)    {if(getpixel(j,q)==WHITE)putpixel(j,q,RED);elseputpixel(j,q,WHITE);}x+=xIncre;y+=yIncre;}        }    }}int main(){    init();    initgraph(750,650);    display();    fill();    getch();    closegraph();    return 0;}


原创粉丝点击