0% found this document useful (0 votes)
85 views

Scan Line Algorithm

This document describes three different algorithms for filling polygons in graphics: 1. Boundary fill (bfill) recursively fills the interior bounded by a polygon edge, starting from a seed point. 2. Flood fill (ffill) similarly recursively fills the interior, but also fills connected regions of the same color. 3. Scanline fill (scanfill) iterates through each scanline, finds the intersection points of the scanline with the polygon edges, and draws horizontal lines between intersections to fill the interior. The document includes code to get user input for a polygon, draw the polygon outline, and call the different fill functions to demonstrate the algorithms.

Uploaded by

Abdullah Khan
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
85 views

Scan Line Algorithm

This document describes three different algorithms for filling polygons in graphics: 1. Boundary fill (bfill) recursively fills the interior bounded by a polygon edge, starting from a seed point. 2. Flood fill (ffill) similarly recursively fills the interior, but also fills connected regions of the same color. 3. Scanline fill (scanfill) iterates through each scanline, finds the intersection points of the scanline with the polygon edges, and draws horizontal lines between intersections to fill the interior. The document includes code to get user input for a polygon, draw the polygon outline, and call the different fill functions to demonstrate the algorithms.

Uploaded by

Abdullah Khan
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 5

Scan line polygon fill

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

main()
{

int n,i,j,k,gd,gm,dy,dx;
int x,y,temp;
int a[20][2],xi[20];
float slope[20];

clrscr();
printf("\n\n\tEnter the no. of edges of polygon : ");
scanf("%d",&n);
printf("\n\n\tEnter the cordinates of polygon :\n\n\n ");

for(i=0;i<n;i++)
{
printf("\tX%d Y%d : ",i,i);
scanf("%d %d",&a[i][0],&a[i][1]);
}

a[n][0]=a[0][0];
a[n][1]=a[0][1];

detectgraph(&gd,&gm);
initgraph(&gd,&gm,"c:\\tc\\bgi");

/*- draw polygon -*/

for(i=0;i<n;i++)
{
line(a[i][0],a[i][1],a[i+1][0],a[i+1][1]);
}

getch();

for(i=0;i<n;i++)
{
dy=a[i+1][1]-a[i][1];
dx=a[i+1][0]-a[i][0];

if(dy==0) slope[i]=1.0;
if(dx==0) slope[i]=0.0;
if((dy!=0)&&(dx!=0)) /*- calculate inverse slope -*/
{
slope[i]=(float) dx/dy;
}
}

for(y=0;y< 480;y++)
{
k=0;
for(i=0;i<n;i++)
{

if( ((a[i][1]<=y)&&(a[i+1][1]>y))||
((a[i][1]>y)&&(a[i+1][1]<=y)))
{
xi[k]=(int)(a[i][0]+slope[i]*(y-a[i][1]));
k++;
}
}

for(j=0;j<k-1;j++) /*- Arrange x-intersections in order -*/


for(i=0;i<k-1;i++)
{
if(xi[i]>xi[i+1])
{
temp=xi[i];
xi[i]=xi[i+1];
xi[i+1]=temp;
}
}

setcolor(35);
for(i=0;i<k;i+=2)
{
line(xi[i],y,xi[i+1]+1,y);
getch();
}

Scan line polygon fill -2

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

int n,i,j,k,gd,gm,dy,dx;
static int x,y,temp,xavg=0,yavg=0;
int a[20][2],xi[20],ch;
float slope[20];
void ffill(int sx,int sy,int bc,int fc)
{
  if(getpixel(sx,sy)==bc && getpixel(sx,sy)!=fc)
 {
 putpixel(sx,sy,fc);
 delay(1);
 ffill(sx+1,sy,bc,fc);
 ffill(sx,sy-1,bc,fc);
 ffill(sx-1,sy,bc,fc);
 ffill(sx,sy+1,bc,fc);
 }
  return;
}

 void bfill(int sx,int sy,int bc,int fc)


 {
if(getpixel(sx,sy)==bc)
{
putpixel(sx,sy,fc);
delay(1);
bfill(sx+1,sy,bc,fc);
bfill(sx,sy-1,bc,fc);
bfill(sx-1,sy,bc,fc);
bfill(sx,sy+1,bc,fc);
 }
  return;
 }

void scanfill(int a[20][2])


{
for(i=0;i<n;i++)
{
dy=a[i+1][1]-a[i][1];
dx=a[i+1][0]-a[i][0];
if(dy==0) slope[i]=1.0;
if(dx==0) slope[i]=0.0;
if((dy!=0)&&(dx!=0))            /*- calculate inverse slope -*/
{
slope[i]=(float) dx/dy;
}
}
for(y=0;y< 480;y++)
{
k=0;
for(i=0;i<n;i++)
{
if(((a[i][1]<=y)&&(a[i+1][1]>y))||
((a[i][1]>y)&&(a[i+1][1]<=y)))
{
xi[k]=(int)(a[i][0]+slope[i]*(y-a[i][1]));
k++;
}
}

for(j=0;j<k-1;j++)               /*- Arrange x-intersections in order -*/


for(i=0;i<k-1;i++)
{
if(xi[i]>xi[i+1])
{
temp=xi[i];
xi[i]=xi[i+1];
xi[i+1]=temp;
}
}
setcolor(35);
delay(1);
for(i=0;i<k;i+=2)
{
line(xi[i],y,xi[i+1]+1,y);
}
}
getch();
}

void drawp()
{
printf("\n\n\tEnter the no. of edges of polygon : ");
scanf("%d",&n);
printf("\n\n\tEnter the cordinates of polygon :\n\n\n ");

for(i=0;i<n;i++)
{
 printf("\tx%d y%d : ",i,i);
 scanf("%d %d",&a[i][0],&a[i][1]);
 xavg+=a[i][0];
 yavg+=a[i][1];
}

a[n][0]=a[0][0];
a[n][1]=a[0][1];
xavg=xavg/n;
yavg=yavg/n;
/*- draw polygon -*/
for(i=0;i<n;i++)
{
 line(a[i][0],a[i][1],a[i+1][0],a[i+1][1]);
}

//switch for color


printf("\n0.Exit\t1.Bfill\t2.Ffill\t3.Scanfill\tEnter Choice: ");
scanf("%d",&ch);
switch(ch)
 {
case 0: break;
case 2: ffill(xavg+1,yavg+1,0,15); break;
case 1: bfill(xavg+1,yavg+1,0,15); break;
case 3: scanfill(a); break;x
default: printf("\nSomething goes wromg...!!\n");
 }

}//function close

void main()
{
clrscr();
detectgraph(&gd,&gm);
initgraph(&gd,&gm,"c:\\tc\\bgi");
 drawp();
 getch();
}

You might also like