Anda di halaman 1dari 6

Area Filling

Dalam grafis, selain digunakan primtif-primitif grafis, diperlukan algoritma khusus untuk
mengisi warna. Untuk pengisian warna pada grafik diterapkan pada objek yang memiliki hole.

Beberapa algortima yang dapat digunakan untuk melakukan area filling, yaitu :
Scan Line
Boundary Fill Algorithm
Flood Fill Algorithm

Scan Line

Dimulai dari kiri atas layar
Bergerak ke kanan hingga batas kanan layar
Ulangi untuk baris-baris berikutnya
Jika ditemukan suatu batas area, maka dilakukan operasi putpixel hingga ditemukan
batas area berikutnya

Kelemahan :
Algoritma akan gagal jika ditemui titik-titik ujung, sehingga perlu penanganan khusus.
Solusi :
Periksa semua informasi titik ujung berdasarkan list vector yang dimiliki setiap primitif.

Boundary-fill Algorithm

Dengan teknik ini pengisian warna dilakukan berdasarkan penentuan titik awal. Posisi awal
diletakkan pada area filling. Kemudian semua titik tetangga diuji terhadap batas area. Ada 2
metoda untuk mencari titik tetangga :
4 Connected
8 Connected





7 8 9 . . . .
6
5
4
3
2
1














1
4 X 2
3
BFill (x,y,Red,Black);
Seed position (x,y)
Bila Area Fill menjadi atribut dari objek maka warna batas dari proses ini akan sama dengan
warna batas objek. Ingat bahwa boundry objek tidak boleh ada lubang.
Contoh algoritma dalam bahasa C:


/*Graphics algorithm to impliment the BOUNDARY-FILL-4 Algorithm */

#include<dos.h>
#include<stdio.h>
#include<conio.h>
#include<graphics.h>

void drawpolygon(int n,int arr[][2],int color);
void boundfill4(int x,int y,int fill,int boundary);

void main()
{
int arr[10][2],n,x,y;
printf("Enter the number of edges : ");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("Enter the X and Y position for %d edge : ",i+1);
scanf("%d %d",&arr[i][0],&arr[i][1]);
}
printf("Enter X and Y co-ordinates of the point from where you want \n");
printf("to start BOUNDARY-FILL : ");
scanf("%d %d",&x,&y);
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc\\bgi");
drawpolygon(n,arr,RED);
getch();
boundfill4(x,y,BLUE,RED);
getch();
closegraph();
restorecrtmode();
}
void drawpolygon(int n,int arr[][2],int color)
{
setcolor(color);
for(int i=0;i<n;i++) {
if( i == n-1 )
line(arr[i][0],arr[i][1],arr[0][0],arr[0][1]);
else
line(arr[i][0],arr[i][1],arr[i+1][0],arr[i+1][1]);
}
}




void boundfill4(int x,int y,int fill,int boundary) //boundary=RED
{
//fill=BLUE
int current;
current = getpixel(x,y);
if( (current != boundary) && (current != fill) )
{
delay(2);
putpixel(x,y,fill);
boundfill4(x+1,y,fill,boundary);
boundfill4(x-1,y,fill,boundary);
boundfill4(x,y+1,fill,boundary);
boundfill4(x,y-1,fill,boundary);
}
}
/*Graphics algorithm to impliment the BOUNDARY-FILL-8 Algorithm */

#include<dos.h>
#include<stdio.h>
#include<conio.h>
#include<graphics.h>

void boundfill8(int x,int y,int fill,int boundary);

void main()
{
int r,x1,y1,x2,y2;
printf("Enter Left and Top co-ordinates to draw a SQUARE : ");
scanf("%d %d",&x1,&y1);
printf("Enter Right and Bottom co-ordinates to draw a SQUARE : ");
scanf("%d %d",&x2,&y2);

int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc\\bgi");
setcolor(RED);
rectangle(x1,y1,x2,y2);
getch();
printf("Enter X and Y co-ordinates to Fill a circle using BOUNDRY-FILL : ");
scanf("%d %d",&x1,&y1);
boundfill8(x1,y1,BLUE,RED);
getch();
closegraph();
restorecrtmode();
}


void boundfill8(int x,int y,int fill,int boundary)
{
int current;
current = getpixel(x,y);
if( (current != boundary) && (current != fill) )
{
putpixel(x,y,fill);
delay(2);
boundfill8(x-1,y-1,fill,boundary);
boundfill8(x,y-1,fill,boundary);
boundfill8(x+1,y-1,fill,boundary);
boundfill8(x-1,y,fill,boundary);
boundfill8(x+1,y,fill,boundary);
boundfill8(x-1,y+1,fill,boundary);
boundfill8(x,y+1,fill,boundary);
boundfill8(x+1,y+1,fill,boundary);
}
}
Flood Fill Algorithm
Proses flood fill mirip dengan boundary fill, dimana inti dari proses ini adalah mengubah suatu
warna menjadi warna yang lain.
Contoh algoritma dalam bahasa C:

//FLOOD FILL WITH EIGHT CONNECTED REGIONS
#include<stdio.h>
#include<graphics.h>
main()
{
int gd,gm;
detectgraph(&gd,&gm);
initgraph(&gd,&gm,"c:\\tc\\bgi");
rectangle(50,50,100,100);
flood(55,55,4,15);
getch();
closegraph();
}
flood(seed_x,seed_y,foreground_col,background_col)
{
if(getpixel(seed_x,seed_y)!=background_col && getpixel(seed_x,seed_y)!= foreground_col)
{
putpixel(seed_x,seed_y,foreground_col);
flood(seed_x+1,seed_y,foreground_col,background_col);
flood(seed_x-1,seed_y,foreground_col,background_col);
flood(seed_x,seed_y+1,foreground_col,background_col);
flood(seed_x,seed_y-1,foreground_col,background_col);
flood(seed_x+1,seed_y+1,foreground_col,background_col);
flood(seed_x-1,seed_y-1,foreground_col,background_col);
flood(seed_x+1,seed_y-1,foreground_col,background_col);
flood(seed_x-1,seed_y+1,foreground_col,background_col);
}
}