邊緣填充算法


#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 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);
    else
    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);
        if(getpixel(p,q)==BLUE)  //背景色為藍色,填充色為紅色
        putpixel(p,q,RED);
        else
        putpixel(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;
}

 

修改版

 

#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 sol1()//繪制該多邊形的外輪廓
{
    int i;
    setbkcolor(BLUE);  
    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 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++)
    {
        //如果線段是水平線或者是右邊邊界,只畫線,不做處理
        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)==BLUE)
                    putpixel(j,q,RED);
                  //否則就填充藍色
                  else
                      putpixel(j,q,BLUE);
              }
              x+=xIncre;
              y+=yIncre;
           }
        }
    }
}
int main()
{

    init();
    initgraph(1400,800);
    sol1();
    sol2();
    getch();
    closegraph();
    return 0;
}
/*
10 10
700 10
700 500
600 400
400 600
300 200
200 300
*/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM