Write a c program to clip a line using Cohen and Sutherland line clipping algorithm.
Here Below is the C program that implements the Cohen-Sutherland Line Clipping Algorithm. This algorithm is used to clip a line segment to a rectangular viewport defined by the window's coordinates. The program determines whether the line is entirely inside, partially inside, or entirely outside the clipping window.
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
// Define the region codes
#define INSIDE 0 // 0000
#define LEFT 1 // 0001
#define RIGHT 2 // 0010
#define BOTTOM 4 // 0100
#define TOP 8 // 1000
// Define the clipping window (viewport)
int xmin = 100, ymin = 100, xmax = 300, ymax = 300;
// Compute the region code for a point (x, y)
int computeCode(int x, int y) {
int code = INSIDE;
if (x < xmin) // to the left of the window
code |= LEFT;
else if (x > xmax) // to the right of the window
code |= RIGHT;
if (y < ymin) // below the window
code |= BOTTOM;
else if (y > ymax) // above the window
code |= TOP;
return code;
}
// Cohen-Sutherland line clipping algorithm
void cohenSutherlandClip(int x1, int y1, int x2, int y2) {
int code1 = computeCode(x1, y1);
int code2 = computeCode(x2, y2);
int accept = 0;
while (1) {
if ((code1 == 0) && (code2 == 0)) {
// Both endpoints are inside the viewport
accept = 1;
break;
} else if (code1 & code2) {
// Both endpoints are outside the viewport, and on the same side
break;
} else {
// Some portion of the line is inside the viewport
int codeOut;
int x, y;
// Determine which endpoint is outside the viewport
if (code1 != 0)
codeOut = code1;
else
codeOut = code2;
// Find the intersection point
if (codeOut & TOP) {
x = x1 + (x2 - x1) * (ymax - y1) / (y2 - y1);
y = ymax;
} else if (codeOut & BOTTOM) {
x = x1 + (x2 - x1) * (ymin - y1) / (y2 - y1);
y = ymin;
} else if (codeOut & RIGHT) {
y = y1 + (y2 - y1) * (xmax - x1) / (x2 - x1);
x = xmax;
} else if (codeOut & LEFT) {
y = y1 + (y2 - y1) * (xmin - x1) / (x2 - x1);
x = xmin;
}
// Update the outside point to the intersection point
if (codeOut == code1) {
x1 = x;
y1 = y;
code1 = computeCode(x1, y1);
} else {
x2 = x;
y2 = y;
code2 = computeCode(x2, y2);
}
}
}
// If the line is accepted, plot it
if (accept) {
line(x1, y1, x2, y2);
} else {
printf("Line rejected\n");
}
}
int main() {
int gd = DETECT, gm;
initgraph(&gd, &gm, ""); // Initialize graphics mode
// Draw the clipping window (rectangular viewport)
rectangle(xmin, ymin, xmax, ymax);
int x1, y1, x2, y2;
printf("Enter the coordinates of the first endpoint of the line (x1, y1): ");
scanf("%d %d", &x1, &y1);
printf("Enter the coordinates of the second endpoint of the line (x2, y2): ");
scanf("%d %d", &x2, &y2);
// Call the Cohen-Sutherland line clipping algorithm
cohenSutherlandClip(x1, y1, x2, y2);
// Wait for the user to press a key before closing the graphics window
getch();
closegraph();
return 0;
}