Graphics—边缘填充算法

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

边缘填充算法的基本思想是,逐边向右求补。可以按任意顺序处理多边形的每条边,在处理每条边时,首先求出该边与扫描线的交点

,然后将每一条扫描线上交点右方的所有像素取补,多边形的所有边处理完毕之后,填充即完成
*/
#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 -99999999
int 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);
                  //否则就填充白色
					else
						putpixel(j,q,WHITE);
				}
				x+=xIncre;
				y+=yIncre;
			}
        }
    }
}
int main()
{

    init();
    initgraph(800,700);
    display();
    fill();
    getch();
    closegraph();
    return 0;
}
/*
100 100
700 100
700 500
600 400
400 600
300 200
200 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 -99999999

int 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);
					else
						putpixel(j,q,WHITE);
				}
				x+=xIncre;
				y+=yIncre;
			}
        }

    }
}
int main()
{
    init();
    initgraph(750,650);
    display();
    fill();
    getch();
    closegraph();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值