Liang-Barsky Line clipping algo
Liang-Barsky Line clipping algorithm program
Code
#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<stdlib.h>
void main()
{
int gd = DETECT, gm, k;
float x1, y1, x2, y2, xmin, ymin, xmax, ymax, dx, dy, p[4], q[4], r[4], u1=0.0, u2=1.0;
initgraph(&gd, &gm, "c:\\tc\\bgi");
clrscr();
printf("\nENTER THE BOUNDARIES OF THE CLIPPING WINDOW(XMIN, YMIN, XMAX, YMAX):");
scanf("%f %f %f %f", &xmin, &ymin, &xmax, &ymax);
printf("\n\nENTER THE VALUES OF THE TWO END POINTS OF THE LINE( (X1, Y1) AND (X2, Y2) ):");
scanf("%f %f %f %f", &x1, &y1, &x2, &y2);
clrscr();
rectangle(xmin, ymax, xmax, ymin);
line(x1, y1, x2, y2);
getch();
dx = x2 - x1;
dy = y2 - y1;
p[0] = -dx;
p[1] = dx;
p[2] = -dy;
p[3] = dy;
q[0] = x1 - xmin;
q[1] = xmax - x1;
q[2] = y1 - ymin;
q[3] = ymax - y1;
for(k = 0; k <= 3; k++)
{
if(p[k] == 0 && q[k] < 0)
{
printf("THE LINE IS COMPLETELY OUTSIDE THE CLIPPING WINDOW.........");
getch();
}
}
for(k = 0; k <= 3; k++)
{
if(p[k] < 0)
{
r[k] = q[k] / p[k];
u1 = max(u1, r[k]);
}
if(p[k] > 0)
{
r[k] = q[k] / p[k];
u2 = min(u2, r[k]);
}
}
if(u1 > u2)
{
printf("THE LINE IS COMPLETELY OUTSIDE THE CLIPPING WINDOW.........");
getch();
}
if(u1 == 0.0 && u2 == 1.0)
{
printf("THE LINE IS COMPLETELY INSIDE THE CLIPPING WINDOW.........");
getch();
}
if(u1 < u2 && u1 != 0.0 && u2 != 1.0)
{
x2 = x1 + (dx * u2);
y2 = y1 + (dy * u2);
x1 = x1 + (dx * u1);
y1 = y1 + (dy * u1);
clrscr();
printf("THE REQUIRED CLIPPED LINE IS:");
rectangle(xmin, ymax, xmax, ymin);
line(x1, y1, x2, y2);
getch();
}
}