2D Clipping
1.Line Clipping - Cohen Sutherland Outcode Method
1.Line Clipping - Cohen Sutherland Outcode Method
#include<stdio.h>
#include<conio.h>
/*Header file for built-in graphics functions such as plot() and initgraph()*/
#include<graphics.h>
#include<math.h>
#define TRUE 1
#define FALSE 0
typedef unsigned int outcode;
outcode CompOutCode(float x,float y);
enum { TOP = 0x1,
BOTTOM = 0x2,
RIGHT = 0x4,
LEFT = 0x8
};
int xmin,xmax,ymin,ymax;
/*This function uses 4 bit codes for both the endpoints to find if the line needs to be clipped and if yes, it finds the intersection point and displays the clipped line */
void clip(float x0,float y0,float x1,float y1)
{
outcode outcode0,outcode1,outcodeOut;
int accept = FALSE,done = FALSE;
outcode0 = CompOutCode(x0,y0);
outcode1 = CompOutCode(x1,y1);
do
{
if(!(outcode0|outcode1))
{
accept = TRUE;
done = TRUE;
}
else if(outcode0 & outcode1)
done = TRUE;
else
{
float x,y;
outcodeOut = outcode0?outcode0:outcode1;
if(outcodeOut & TOP)
{
x = x0+(x1-x0)*(ymax-y0)/(y1-y0);
y = ymax;
}
else if(outcodeOut & BOTTOM)
{
x = x0+(x1-x0)*(ymin-y0)/(y1-y0);
y = ymin;
}
else if(outcodeOut & RIGHT)
{
y = y0+(y1-y0)*(xmax-x0)/(x1-x0);
x = xmax;
}
else
{
y = y0+(y1-y0)*(xmin-x0)/(x1-x0);
x = xmin;
}
if(outcodeOut==outcode0)
{
x0 = x;
y0 = y;
outcode0 = CompOutCode(x0,y0);
}
else
{
x1 = x;
y1 = y;
outcode1 = CompOutCode(x1,y1);
}
}
}while(done==FALSE);
if(accept)
line(x0,y0,x1,y1);/*line(x1,y1,x2,y2) draws line on screen with (x1,y1) and (x2,y2) specifying the endpoint of line*/
/*outtextxy(x,y,"string") prints string on screen starting with the pixel specified by(x,y)*/
outtextxy(200,20,"LINE AFTER CLIPPING");
/*rectangle(x1,y1,x2,y2) draws rectangle on screen with (x1,y1) and (x2,y2) specifying coordinates of top-left and bottom-right vertex respectively.*/
rectangle(xmin,ymin,xmax,ymax);
}
/* This function checks a point(x,y) with four boundaries to see whether it lies outside or inside and returns result in form of a 4 bit code*/
outcode CompOutCode(float x,float y)
{
outcode code = 0;
if(y>ymax)
code|=TOP;
else if(y<ymin)
code|=BOTTOM;
if(x>xmax)
code|=RIGHT;
else if(x<xmin)
code|=LEFT;
return code;
}
int main( )
{
int x1,y1,x2,y2;
int gd = DETECT,gm ;
initgraph(&gd, &gm, "c:\\tc\\bgi");/*loads the graphic driver and puts system into graphics mode*/
/*
syntax for initgraph() is:
void initgraph(int *graphdriver, int *graphmode, char *pathtodriver);
*graphdriver is an integer that specifies the graphics driver to be used.DETECT requests auto-detect for the driver.
*graphmode is an integer that specifies the initial graphics mode.If *graphdriver equals DETECT,*graphmode is set by initgraph to the highest resolution available for the detected driver.
*/
printf("\t\t\tCOHEN SUTHERLAND LINE CLIPPING ALGORITHM\n\n\tEnter the endpoints of line");
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
printf("\n\tEnter the rectangular coordinates of clipping window");
scanf("%d %d %d %d",&xmin,&ymin,&xmax,&ymax);
/*outtextxy(x,y,"string") prints string on screen starting with the pixel specified by(x,y)*/
outtextxy(200,100,"LINE BEFORE CLIPPING");
/*line(x1,y1,x2,y2) draws line on screen with (x1,y1) and (x2,y2) specifying the endpoint of line*/
line(x1,y1,x2,y2);
/*rectangle(x1,y1,x2,y2) draws rectangle on screen with (x1,y1) and (x2,y2) specifying coordinates of top-left and bottom-right vertex respectively.*/
rectangle(xmin,ymin,xmax,ymax);
getch();
cleardevice();
clip(x1,y1,x2,y2);
getch();
return 0;
}
2.Sutherland Hogman Polygon Clipping #include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <process.h>
#define TRUE 1
#define FALSE 0
typedef unsigned int outcode;
outcode CompOutCode(float x,float y);
enum
{
TOP = 0x1,
BOTTOM = 0x2,
RIGHT = 0x4,
LEFT = 0x8
};
float xmin,xmax,ymin,ymax;
void clip(float x0,float y0,float x1,float y1)
{
outcode outcode0,outcode1,outcodeOut;
int accept = FALSE,done = FALSE;
outcode0 = CompOutCode(x0,y0);
outcode1 = CompOutCode(x1,y1);
do
{
if(!(outcode0|outcode1))
{
accept = TRUE;
done = TRUE;
}
else
if(outcode0 & outcode1)
done = TRUE;
else
{
float x,y;
outcodeOut = outcode0?outcode0:outcode1;
if(outcodeOut & TOP)
{
x = x0+(x1-x0)*(ymax-y0)/(y1-y0);
y = ymax;
}
else if(outcodeOut & BOTTOM)
{
x = x0+(x1-x0)*(ymin-y0)/(y1-y0);
y = ymin;
}
else if(outcodeOut & RIGHT)
{
y = y0+(y1-y0)*(xmax-x0)/(x1-x0);
x = xmax;
}
else
{
y = y0+(y1-y0)*(xmin-x0)/(x1-x0);
x = xmin;
}
if(outcodeOut==outcode0)
{
x0 = x;
y0 = y;
outcode0 = CompOutCode(x0,y0);
}
else
{
x1 = x;
y1 = y;
outcode1 = CompOutCode(x1,y1);
}
}
}while(done==FALSE);
if(accept)
line(x0,y0,x1,y1);
outtextxy(150,20,"POLYGON AFTER CLIPPING");
rectangle(xmin,ymin,xmax,ymax);
}
outcode CompOutCode(float x,float y)
{
outcode code = 0;
if(y>ymax)
code|=TOP;
else if(y<ymin)
code|=BOTTOM;
if(x>xmax)
code|=RIGHT;
else if(x<xmin)
code|=LEFT;
return code;
}
void main( )
{
float x1,y1,x2,y2;
/* request auto detection */
int gdriver = DETECT, gmode, n,poly[14],i;
clrscr( );
printf("Enter the no of sides of polygon:");
scanf("%d",&n);
printf("\nEnter the coordinates of polygon\n");
for(i=0;i<2*n;i++)
{
scanf("%d",&poly[i]);
}
poly[2*n]=poly[0];
poly[2*n+1]=poly[1];
printf("Enter the rectangular coordinates of clipping window\n");
scanf("%f%f%f%f",&xmin,&ymin,&xmax,&ymax);
/* initialize graphics and local variables */
initgraph(&gdriver, &gmode, "c:\\tc\\bgi");
outtextxy(150,20,"POLYGON BEFORE CLIPPING");
drawpoly(n+1,poly);
rectangle(xmin,ymin,xmax,ymax);
getch( );
cleardevice( );
for(i=0;i<n;i++)
clip(poly[2*i],poly[(2*i)+1],poly[(2*i)+2],poly[(2*i)+3]);
getch( );
restorecrtmode( );
}
Comments
Post a Comment