Computer Graphics

Index:
(1) DIGITAL DIFFERENTIAL ANALYSER CODE
(2) Center shifted Modified Bresenham algorithm
(3) BRESENHAM'S CIRCLE
(4) Midpoint circle algorithm
(5) Mid point Ellipse Drawing
(6) SUTHERLAND-HODGMAN POLYGON CLIPPING
(7) Liang Barsky Algorithm
(8) Line clipping using cohen sutherland
(9) Polygon filling algorithm using scanline fill algorithm
 

---------------------------------------------------------------------------------------------------------------------------------  
 Programs:

(1) DIGITAL DIFFERENTIAL ANALYSER CODE

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

void main()
{

int gd,gm;
float xi,yi,x,y;
int xmax,ymax,xo,yo; /*declaring x and y increments,coordinates*/
int x1,y1,x2,y2,dx,dy,steps,k; /*declaring pixel positions*/

clrscr();

printf("Enter the co-ordinates of first point (x1 y1) : ");
scanf("%d %d",&x1,&y1);
printf("Enter the co-ordinates of second point (x2 y2): ");
scanf("%d %d",&x2,&y2);

detectgraph(&gd,&gm);
initgraph(&gd,&gm,"c:\\tc\\bgi"); /*Initialisation of graphics*/

xmax=640;ymax=480;
xo=xmax/2;yo=ymax/2; /*divides the screen so that the origin is
shifte to origin*/
line(320,0,320,480); /*plotting x and y axis on the screen*/
line(0,240,640,240);

dx = x2 - x1; /*calculating the distance between the x coordinates(Horizontal difference)*/
dy = y2 - y1; /*calculating the distance between the y coordinates(vertical difference)*/

if(abs(dx) > abs(dy)) /*checking the value of slope to determine the value of parameter steps*/
steps = abs(dx);
else
steps = abs(dy);

xi = (float)dx/steps;
yi = (float)dy/steps;


x = x1; /*original values*/
y = y1;

for(k=0;k<=steps;k++) /*Looping through the process steps time*/
{
putpixel(xo+x, ymax-(yo+y), WHITE);

/*If dx>dy and x1<x2,values of increments in x and y are 1 and m,but if
x1>x2,decrements of -1 and -m generate new point on the line*/
/* otherwise if dy>dx unit increment or decrement in y direction and x increment or decrement of 1/m */

x = x + xi;
y = y + yi;

}

getch();
closegraph();

}/*-main()-*/

 
  ---------------------------------------------------------------------------------------------------------------------------------


(2) Center shifted Modified Bresenham algorithm

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

void main()
{
int k,dx,dy,x,y,p,x1,y1,x2,y2;
int gd,gm,xo,yo,xmax,ymax,xincre,yincre ;

clrscr();

printf("\n\n\tEnter the co-ordinates of first point : ");
scanf("%d %d",&x1,&y1);
printf("\n\n\tEnter the co-ordinates of second point : ");
scanf("%d %d",&x2,&y2);

dx = (x2 - x1);
dy = (y2 - y1);

p = 2 * abs(dy) - abs(dx);

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

xmax = 640; ymax = 480;
xo = xmax/2; yo = ymax/2;

line(320,0,320,480);
line(0,240,640,240);

x = x1; y = y1;

putpixel(xo+x1, ymax-(yo+y1), WHITE);

xincre = dx/abs(dx);
yincre = dy/abs(dy);

if(abs(dy) < abs(dx))
{
for(k=0; k<=abs(dx); k++)
{

x = x + xincre;

if(p < 0)
p = p + 2 * abs(dy);
else
{
y = y + yincre;
p = p + 2 * (abs(dy) - abs(dx));
}

putpixel(xo+x, ymax-(yo+y), WHITE);
}
}
else
{
for(k=0; k<=abs(dy); k++)
{
y = y + yincre;

if(p < 0)
p = p + 2 * abs(dx);
else
{
x = x + xincre;
p = p + 2 * (abs(dx) - abs(dy));
}

putpixel(xo+x, ymax-(yo+y), WHITE);
}
}

getch();
closegraph();

}


---------------------------------------------------------------------------------------------------------------------------------
 
(3) BRESENHAM'S CIRCLE

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

void main()
{
int gd=DETECT,gm;
int r,x,y,p,xc=320,yc=240; /*INPUT radius and center coordinates*/

initgraph(&gd,&gm,"C:\\TC\\BGI");
cleardevice();


printf("Enter the radius ");
scanf("%d",&r);


x=0; /*obtaining first point on circmference of circle*/
y=r;
putpixel(xc+x,yc-y,1);

p=3-(2*r); /*decision parameter*/

for(x=0;x<=y;x++)
{
if (p<0)
{
y=y;
p=(p+(4*x)+6);
}
else
{
y=y-1;

p=p+((4*(x-y)+10));
}

putpixel(xc+x,yc-y,1);
putpixel(xc-x,yc-y,2);
putpixel(xc+x,yc+y,3);
putpixel(xc-x,yc+y,4);
putpixel(xc+y,yc-x,5);
putpixel(xc-y,yc-x,6);
putpixel(xc+y,yc+x,7);
putpixel(xc-y,yc+x,8);

}
getch();
closegraph();
}


---------------------------------------------------------------------------------------------------------------------------------
  
 (4) Midpoint circle algorithm

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

void main() /*main Startes*/
{

int gd=DETECT,gm;
int x,y,r;
void Drawcircle(int,int,int);
/*taking radius*/
printf("Enter the Mid points and Radious:");
scanf("%d%d%d",&x,&y,&r);
initgraph(&gd,&gm,"c:\\tc\\bgi ");
Drawcircle(x,y,r);/*function called*/
getch();
closegraph();
} /*main ends*/
/*function for drawing circle*/
void Drawcircle(int x1,int y1,int r)
{

int x=0,y=r,p=1-r;
void cliplot(int,int,int,int);
cliplot(x1,y1,x,y); /*function called */
/*calculate pixel position(x,y) onto the cercular pat center on (x0y0)
and plot the co-ordinates*/
while(x<y)
{
x++;
if(p<0)
p+=2*x+1;
else
{
y--;
p+=2*(x-y)+1;
}
cliplot(x1,y1,x,y);
}
}
/*drawing*/
void cliplot(int xctr,int yctr,int x,int y)/*function*/
{

putpixel(xctr +x,yctr +y,1);
putpixel(xctr -x,yctr +y,1);
putpixel(xctr +x,yctr -y,1);
putpixel(xctr -x,yctr -y,1);
putpixel(xctr +y,yctr +x,1);
putpixel(xctr -y,yctr +x,1);
putpixel(xctr +y,yctr -x,1);
putpixel(xctr -y,yctr -x,1);
getch();
}
---------------------------------------------------------------------------------------------------------------------------------

(5) Mid point Ellipse Drawing 

 #include<stdio.h>
#include<graphics.h>
#include<conio.h>
void putelpix(float xc,float yc,float x,float y)
{
putpixel((int)(xc+x),(int)(yc+y),15);
putpixel((int)(xc-x),(int)(yc-y),15);
putpixel((int)(xc+x),(int)(yc-y),15);
putpixel((int)(xc-x),(int)(yc+y),15);
}
/*Calculating initial value of decision parameter in regions*/
void mdpt(float xc,float yc,float rx,float ry)
{
float x=0,y=ry,p1,p2,t1,t2;
int k;
/*Calculating initial value of decision parameter in region 1*/
p1=ry*ry-rx*rx*ry+0.25*rx*rx;
putelpix(xc,yc,x,y);
for(k=0;(2*ry*ry*x)<=(2*rx*rx*y);k++)
{
t1=2*ry*ry*x+2*ry*ry;
t2=2*rx*rx*y-2*rx*rx;
if(p1<0)
p1=p1+t1+ry*ry;
else
{
p1=p1+t1-t2+ry*ry;
y--;
}
x++;
putelpix(xc,yc,x,y);

}
/*Calculating initial value of decision parameter in region 2*/
p2=ry*ry*(x+.5)*(x+.5)+rx*rx*(y-1)*(y-1)-rx*rx*ry*ry;
putelpix(xc,yc,x,y);
for(k=0;y>=0;k++)
{
t1=2*ry*ry*x+2*ry*ry;
t2=2*rx*rx*y-2*rx*rx;
if(p2>0)
p2=p2-t2+rx*rx;
else
{
p2=p2+t1-t2+rx*rx;
x++;
}
y--;
putelpix(xc,yc,x,y);

}
}
void main()/*Main started*/
{
int gd=DETECT,gm;
float xc,yc,rx,ry;
initgraph(&gd,&gm,"c:\\tc\\bgi");
/* obtaining the first point on an ellipse for centering the origin*/
printf("Enter Ellipes center coordinates x,y");
scanf("%f%f",&xc,&yc);
printf("Enter Ellipes center coordinates rx,ry");
scanf("%f%f",&rx,&ry);
mdpt(xc,yc,rx,ry); /**Calling midpoint function/
getch();
closegraph();
}/*Main Endes */

 

---------------------------------------------------------------------------------------------------------------------------------

(6) SUTHERLAND-HODGMAN POLYGON CLIPPING

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

int n,p,x,y,i,j;
int xwmin,ywmin,xwmax,ywmax;
int x1,y1,x2,y2,xmax,ymax;
float m;
char flag;
float dy,dx;

main()
{


int gd,gm;
int a[10][10],b[10][10],c[10][10],d[10][10],e[10][10];

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


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];


printf("\n\tEnter the co_ordinates of window :\n ");
printf("\n\txwmin , ywmin : ");
scanf("%d %d",&xwmin,&ywmin);
printf("\n\txwmax , ywmax : ");
scanf("%d %d",&xwmax,&ywmax);


xmax = 640; ymax = 480;

cleardevice();

setcolor(35);
for(i=0;i<n;i++)
{
line(a[i][0],ymax-a[i][1],a[i+1][0],ymax-a[i+1][1]);
}
rectangle(xwmin,ymax-ywmin,xwmax,ymax-ywmax);
getch();
setcolor(35);

clip_left(a,b);
clip_right(b,c);
clip_bottom(c,d);
clip_top(d,e);

cleardevice();
setcolor(63);
for(i=0;i<p;i++)
{
line(e[i][0],ymax-e[i][1],e[i+1][0],ymax-e[i+1][1]);
}
getch();




}/*-main()-*/

/*---------------------------------------------------------------*/

clip_left(int a[10][10], int b[10][10])
{

p=0;flag=0;m=0;
for(i=0;i<n;i++)
{

dy=a[i+1][1]-a[i][1];
dx=a[i+1][0]-a[i][0];


if((dx!=0)&&(dy!=0))
{
m=(dy/dx);
}

if((a[i][0]<xwmin)&&(a[i+1][0]>=xwmin) ) flag=0;
if((a[i][0]>=xwmin)&&(a[i+1][0]>=xwmin)) flag=1;
if((a[i][0]>=xwmin)&&(a[i+1][0]<xwmin)) flag=2;
if((a[i][0]<xwmin)&&(a[i+1][0]<xwmin) ) flag=3;


switch(flag)
{
case 0 :
x=xwmin;
if(dy!=0)
y=(int)(a[i][1]+m*(x-a[i][0]));
else
y=a[i][1];

b[p][0]=x;
b[p][1]=y;
p++;

b[p][0]=a[i+1][0];
b[p][1]=a[i+1][1];
p++;
break;

case 1 :
b[p][0]=a[i+1][0];
b[p][1]=a[i+1][1];
p++;
break;

case 2 :
x=xwmin;
if(dy!=0)
y=(int)(a[i][1]+m*(x-a[i][0]));
else
y=a[i][1];

b[p][0]=x;
b[p][1]=y;
p++;
}


}/*-for()-*/

b[p][0]=b[0][0];
b[p][1]=b[0][1];

cleardevice();
setcolor(35);
rectangle(xwmin,ymax-ywmin,xwmax,ymax-ywmax);
setcolor(63);

for(i=0;i<p;i++)
{
line(b[i][0],ymax-b[i][1],b[i+1][0],ymax-b[i+1][1]);
getch();
}
getch();
}

/*--------------------------------------------------------*/


clip_right(int b[10][10],int c[10][10])
{

n=p; p=0; m=0;

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

if((dx!=0)&&(dy!=0))
{
m=(dy/dx);
}

if((b[i][0]>xwmax)&&(b[i+1][0]<=xwmax) ) flag=0;
if((b[i][0]<=xwmax)&&(b[i+1][0]<=xwmax) ) flag=1;
if((b[i][0]<=xwmax)&&(b[i+1][0]>xwmax) ) flag=2;
if((b[i][0]>xwmax)&&(b[i+1][0]>xwmax) ) flag=3;


switch(flag)
{
case 0 :
x=xwmax;
if(dy!=0)
y=(int)(b[i][1]+m*(x-b[i][0]));
else
y=b[i][1];

c[p][0]=x;
c[p][1]=y;
p++;
c[p][0]=b[i+1][0];
c[p][1]=b[i+1][1];
p++;
break;

case 1 :
c[p][0]=b[i+1][0];
c[p][1]=b[i+1][1];
p++;
break;

case 2 :
x=xwmax;
if(dy!=0)
y=(int)(b[i][1]+m*(x-b[i][0]));
else
y=b[i][1];

c[p][0]=x;
c[p][1]=y;
p++;
}


}/*-for()-*/

c[p][0]=c[0][0];
c[p][1]=c[0][1];

cleardevice();
setcolor(35);
rectangle(xwmin,ymax-ywmin,xwmax,ymax-ywmax);
setcolor(63);

for(i=0;i<p;i++)
{
line(c[i][0],ymax-c[i][1],c[i+1][0],ymax-c[i+1][1]);
getch();
}
getch();


}


/*--------------------------------------------------------*/

clip_bottom(int c[10][10],int d[10][10])
{

n=p; p=0; m=0;

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

if((dx!=0)&&(dy!=0))
{
m=(dy/dx);
}


if((c[i][1]<ywmin)&&(c[i+1][1]>=ywmin) ) flag=0;
if((c[i][1]>=ywmin)&&(c[i+1][1]>=ywmin) ) flag=1;
if((c[i][1]>=ywmin)&&(c[i+1][1]<ywmin) ) flag=2;
if((c[i][1]<ywmin)&&(c[i+1][1]<ywmin) ) flag=3;


switch(flag)
{

case 0 :
y=ywmin;
if(dx!=0)
x=abs((int)(c[i][0]+(1/m)*(y-c[i][1])));
else
x=c[i][0];

d[p][0]=x;
d[p][1]=y;
p++;
d[p][0]=c[i+1][0];
d[p][1]=c[i+1][1];
p++;
break;

case 1 :
d[p][0]=c[i+1][0];
d[p][1]=c[i+1][1];
p++;
break;

case 2 :
y=ywmin;
if(dx!=0)
x=abs((int)(c[i][0]+(1/m)*(y-c[i][1])));
else
x=c[i][0];

d[p][0]=x;
d[p][1]=y;
p++;
}



}/*-for()-*/

d[p][0]=d[0][0];
d[p][1]=d[0][1];

cleardevice();
setcolor(35);
rectangle(xwmin,ymax-ywmin,xwmax,ymax-ywmax);
setcolor(63);

for(i=0;i<p;i++)
{
line(d[i][0],ymax-d[i][1],d[i+1][0],ymax-d[i+1][1]);
getch();
}
getch();


}

/*--------------------------------------------------------*/

clip_top(int d[10][10],int e[10][10])
{

n=p;
p=0;

for(i=0;i<n;i++)
{

dy=d[i+1][1]-d[i][1];
dx=d[i+1][0]-d[i][0];

if((dx!=0)&&(dy!=0))
{
m=(dy/dx);
}

if((d[i][1]>ywmax)&&(d[i+1][1]<=ywmax) ) flag=0;
if((d[i][1]<=ywmax)&&(d[i+1][1]<=ywmax) ) flag=1;
if((d[i][1]<=ywmax)&&(d[i+1][1]>ywmax) ) flag=2;
if((d[i][1]>ywmax)&&(d[i+1][1]>ywmax) ) flag=3;

switch(flag)
{
case 0 :
y=ywmax;
if(dx!=0)
x=abs((int)(d[i][0]+(1/m)*(y-d[i][1])));
else
x=d[i][0];

e[p][0]=x;
e[p][1]=y;
p++;
e[p][0]=d[i+1][0];
e[p][1]=d[i+1][1];
p++;
break;

case 1 :
e[p][0]=d[i+1][0];
e[p][1]=d[i+1][1];
p++;
break;

case 2 :
y=ywmax;
if(dx!=0)
x=abs((int)(d[i][0]+(1/m)*(y-d[i][1])));
else
x=d[i][0];

e[p][0]=x;
e[p][1]=y;
p++;
}

}/*-for()-*/

e[p][0]=e[0][0];
e[p][1]=e[0][1];


cleardevice();
setcolor(35);
rectangle(xwmin,ymax-ywmin,xwmax,ymax-ywmax);
setcolor(63);

for(i=0;i<p;i++)
{
line(e[i][0],ymax-e[i][1],e[i+1][0],ymax-e[i+1][1]);
getch();
}

 getch();
}


 

---------------------------------------------------------------------------------------------------------------------------------

(7) Liang Barsky Algorithm 

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

void main()
{
int gd, gm ;
int x1 , y1 , x2 , y2 ;

int wxmin , wymin , wxmax , wymax ;
float u1 = 0.0 , u2 = 1.0 ;

int p1 , q1 , p2 , q2 , p3 , q3 , p4 ,q4 ;
float r1 , r2 , r3 , r4 ;
int x11 , y11 , x22 , y22 ;

clrscr();
printf("Enter the windows left , bottom boundry\n");
scanf("%d%d",&wxmin,&wymin);
printf("Enter the windows right ,bottom boundry\n");
scanf("%d%d",&wxmax,&wymax);

printf("Enter line x1 , y1 co-ordinate\n");
scanf("%d%d",&x1,&y1);

printf("Enter line x2 , y2 co-ordinate\n");
scanf("%d%d",&x2,&y2);


p1 = -(x2 - x1 ); q1 = x1 - wxmin ;
p2 = ( x2 - x1 ) ; q2 = wxmax - x1 ;
p3 = - ( y2 - y1 ) ; q3 = y1 - wymin ;
p4 = ( y2 - y1 ) ; q4 = wymax - y1 ;

if( ( ( p1 == 0.0 ) && ( q1 < 0.0 ) ) ||
( ( p2 == 0.0 ) && ( q2 < 0.0 ) ) ||
( ( p3 == 0.0 ) && ( q3 < 0.0 ) ) ||
( ( p4 == 0.0 ) && ( q4 < 0.0 ) ) )
{
printf("Line is rejected\n");
initgraph(&gd,&gm,"c:\\tc\\bgi");
setcolor(2);
rectangle(wxmin,wymax,wxmax,wymin);
setcolor(1);
line(x1,y1,x2,y2);
getch();
setcolor(0);
line(x1,y1,x2,y2);
getch();
}
else
{
if( p1 != 0.0 )
{
r1 =(float) q1 /p1 ;
if( p1 < 0 )
u1 = max(r1 , u1 );
else
u2 = min(r1 , u2 );
}
if( p2 != 0.0 )
{
r2 = (float ) q2 /p2 ;
if( p2 < 0 )
u1 = max(r2 , u1 );
else
u2 = min(r2 , u2 );

}
if( p3 != 0.0 )
{
r3 = (float )q3 /p3 ;
if( p3 < 0 )
u1 = max(r3 , u1 );
else
u2 = min(r3 , u2 );
}
if( p4 != 0.0 )
{
r4 = (float )q4 /p4 ;
if( p4 < 0 )
u1 = max(r4 , u1 );
else
u2 = min(r4 , u2 );
}

if( u1 > u2 )
printf("line rejected\n");
else
{
x11 = x1 + u1 * ( x2 - x1 ) ;
y11 = y1 + u1 * ( y2 - y1 ) ;

x22 = x1 + u2 * ( x2 - x1 );
y22 = y1 + u2 * ( y2 - y1 );

printf("Original line cordinates\n");
printf("x1 = %d , y1 = %d, x2 = %d, y2 = %d\n",x1,y1,x2,y2);

printf("Windows coordiante are \n");
printf("wxmin = %d, wymin = %d,wxmax = %d , wymax = %d ",wxmin,wymin,wxmax,wymax);

printf("New coordinates are \n");
printf("x1 = %d, y1 = %d,x2 = %d , y2 = %d\n",x11,y11,x22,y22);

initgraph(&gd,&gm,"");
setcolor(2);
rectangle(wxmin,wymax,wxmax,wymin);
setcolor(1);
line(x1,y1,x2,y2);
getch();
setcolor(0);
line(x1,y1,x2,y2);

setcolor(3);
line(x11,y11,x22,y22);
getch();

}
}
}


---------------------------------------------------------------------------------------------------------------------------------

 (8) Line clipping using cohen sutherland

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

typedef unsigned int outcode;
enum { TOP=0x1, BOTTOM=0x2, RIGHT=0x4, LEFT=0x8 };

void lineclip(x0,y0,x1,y1,xwmin,ywmin,xwmax,ywmax )
float x0,y0,x1,y1,xwmin,ywmin,xwmax,ywmax;
{

int gd,gm;
outcode code0,code1,codeout;
int accept = 0, done=0;

code0 = calcode(x0,y0,xwmin,ywmin,xwmax,ywmax);
code1 = calcode(x1,y1,xwmin,ywmin,xwmax,ywmax);

do{
if(!(code0 | code1))
{ accept =1 ; done =1; }
else
if(code0 & code1) done = 1;
else
{
float x,y;
codeout = code0 ? code0 : code1;
if(codeout & TOP)
{
x = x0 + (x1-x0)*(ywmax-y0)/(y1-y0);
y = ywmax;
}
else
if( codeout & BOTTOM)
{
x = x0 + (x1-x0)*(ywmin-y0)/(y1-y0);
y = ywmin;
}
else
if ( codeout & RIGHT)
{
y = y0+(y1-y0)*(xwmax-x0)/(x1-x0);
x = xwmax;
}
else
{
y = y0 + (y1-y0)*(xwmin-x0)/(x1-x0);
x = xwmin;
}
if( codeout == code0)
{
x0 = x; y0 = y;
code0=calcode(x0,y0,xwmin,ywmin,xwmax,ywmax);
}
else
{
x1 = x; y1 = y;
code1 = calcode(x1,y1,xwmin,ywmin,xwmax,ywmax);
}
}
} while( done == 0);

if(accept) line(x0,y0,x1,y1);

rectangle(xwmin,ywmin,xwmax,ywmax);

getch();

}
/*--------------------------------------------------------------------*/

int calcode (x,y,xwmin,ywmin,xwmax,ywmax)
float x,y,xwmin,ywmin,xwmax,ywmax;
{
int code =0;

if(y> ywmax)
code |=TOP;
else if( y<ywmin)
code |= BOTTOM;
else if(x > xwmax)
code |= RIGHT;
else if ( x< xwmin)
code |= LEFT;

return(code);
}

/*-------------------------------------------------*/

main()
{

float x2,y2,x1,y1,xwmin,ywmin,xwmax,ywmax;
int gd,gm;

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

clrscr();
printf("\n\n\tEnter the co-ordinates of Line :");

printf("\n\n\tX1 Y1 : ");
scanf("%f %f",&x1,&y1);

printf("\n\n\tX2 Y2 : ");
scanf("%f %f",&x2,&y2);


printf("\n\tEnter the co_ordinates of window :\n ");
printf("\n\txwmin , ywmin : ");
scanf("%f %f",&xwmin,&ywmin);
printf("\n\txwmax , ywmax : ");
scanf("%f %f",&xwmax,&ywmax);

line(x1,y1,x2,y2);
rectangle(xwmin,ywmin,xwmax,ywmax);
getch();
cleardevice();

lineclip(x1,y1,x2,y2,xwmin,ywmin,xwmax,ywmax );
getch();
closegraph();

}


---------------------------------------------------------------------------------------------------------------------------------

 (9) Polygon filling algorithm using scanline fill algorithm

 #include <stdio.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," ");

for(i=0;i<n;i++) /*- draw poly -*/
{
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(RED);
for(i=0;i<k;i+=2)
{
line(xi[i],y,xi[i+1]+1,y);
delay(10);
}

}/*-for(y)-*/
getch();

}/*-main()-*/

1 comment:

Note: Only a member of this blog may post a comment.

PROGRAMS