#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
*/