Cohen-Sutherland Line Clipping Algorithm
C++ program - Graphics & Multimedia Lab
Sourcecode:
#include<graphics.h>
#include<iostream>
using namespace std;
#define MAX1 20
enum { TOP = 0x8, BOTTOM = 0x4, RIGHT = 0x2, LEFT = 0x1 };
enum { FALSE, TRUE };
typedef unsigned int outcode;
int m=0;
FILE *ip,*op;
outcode compute_outcode(int x, int y, int xmin, int ymin, int xmax, int ymax)
{
outcode oc = 0;
if (y > ymax)
oc |= TOP;
else if (y < ymin)
oc |= BOTTOM;
if (x > xmax)
oc |= RIGHT;
else if (x < xmin)
oc |= LEFT;
return oc;
}
void cohen_sutherland (float x1, float y1, float x2, float y2, float xmin, float ymin, float xmax, float ymax)
{
int accept;
int done;
outcode outcode1, outcode2;
accept = FALSE;
done = FALSE;
outcode1 = compute_outcode (x1, y1, xmin, ymin, xmax, ymax);
outcode2 = compute_outcode (x2, y2, xmin, ymin, xmax, ymax);
do
{
if (outcode1 == 0 && outcode2 == 0)
{
accept = TRUE;
done = TRUE;
}
else if (outcode1 & outcode2)
{
done = TRUE;
}
else
{
double x, y;
double m=(y2-y1)/(x2-x1);
int outcode_ex = outcode1 ? outcode1 : outcode2;
if (outcode_ex & TOP)
{
x = x1 + (ymax - y1)/m;
y = ymax;
}
else if (outcode_ex & BOTTOM)
{
x = x1 + (ymin - y1) /m;
y = ymin;
}
else if (outcode_ex & RIGHT)
{
y = y1 + (xmax - x1)* m;
x = xmax;
}
else
{
y = y1 + (xmin - x1)* m;
x = xmin;
}
if (outcode_ex == outcode1)
{
x1 = x;
y1 = y;
outcode1 = compute_outcode (x1, y1, xmin, ymin, xmax, ymax);
}
else
{
x2 = x;
y2 = y;
outcode2 = compute_outcode (x2, y2, xmin, ymin, xmax, ymax);
}
}
} while (done == FALSE);
if (accept == TRUE)
{
fprintf(op,"\nx[%d] y[%d] x[%d] y[%d]=%.3f %.3f %.3f %.3f:(clipped line)",m,m,m+1,m+1,x1,y1,x2,y2);
m=m+2;
line (x1, y1, x2, y2);
}
else if((accept == FALSE) && (done == TRUE))
{
fprintf(op,"\nThe line (%.3f,%.3f),(%.3f,%.3f)is trivially rejected.",x1,y1,x2,y2);
}
}
int main()
{
int n;
int i, j;
int ln[MAX1][4];
int clip[4];
int gd = DETECT, gm;
ip=fopen("csinput.txt","r");
op=fopen("csoutput.txt","w");
fscanf (ip,"%d", &n);
for (i=0; i<n; i++)
for (j=0; j<4; j++)
fscanf (ip,"%d", &ln[i][j]);
for (i=0; i<4; i++)
fscanf (ip,"%d", &clip[i]);
initgraph (&gd, &gm, NULL);
rectangle (clip[0], clip[1], clip[2], clip[3]);
for (i=0; i<n; i++)
line (ln[i][0], ln[i][1], ln[i][2], ln[i][3]);
getch();
cleardevice();
printf("AFTER CLIPPING");
rectangle (clip[0], clip[1], clip[2], clip[3]);
fprintf(op,"OUTPUT POINTS\n");
for (i=0; i<n; i++)
{
cohen_sutherland (ln[i][0], ln[i][1], ln[i][2], ln[i][3],
clip[0], clip[1], clip[2], clip[3]);
getch();
}
closegraph();
return 0;
}
Output:
nn@linuxmint ~ $ g++ lab7.cpp -lgraph nn@linuxmint ~ $ ./a.out
"csinput.txt"
4 40 40 125 220 10 10 40 210 75 80 175 175 60 230 210 45 55 55 200 2005
"csoutput.txt"
OUTPUT POINTS x[0] y[0] x[1] y[1]=55.000 71.765 115.556 200.000:(clipped line) The line (10.000,10.000),(40.000,210.000)is trivially rejected.








0 comments:
Post a Comment