CG - 6 - 2D Clipping - Cohen Sutherland and Hogman Sutherland

2D Clipping

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