aboutsummaryrefslogtreecommitdiff
path: root/store/works/life/computer-graphics-experiment/3.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'store/works/life/computer-graphics-experiment/3.cpp')
-rw-r--r--store/works/life/computer-graphics-experiment/3.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/store/works/life/computer-graphics-experiment/3.cpp b/store/works/life/computer-graphics-experiment/3.cpp
new file mode 100644
index 0000000..2526d5d
--- /dev/null
+++ b/store/works/life/computer-graphics-experiment/3.cpp
@@ -0,0 +1,144 @@
+// Code referred from
+// https://www.geeksforgeeks.org/line-clipping-set-1-cohen-sutherland-algorithm/
+
+// C++ program to implement Cohen Sutherland algorithm
+// for line clipping.
+#include <iostream>
+using namespace std;
+
+// Defining region codes
+const int INSIDE = 0; // 0000
+const int LEFT = 1; // 0001
+const int RIGHT = 2; // 0010
+const int BOTTOM = 4; // 0100
+const int TOP = 8; // 1000
+
+// Defining x_max, y_max and x_min, y_min for
+// clipping rectangle. Since diagonal points are
+// enough to define a rectangle
+const int x_max = 10;
+const int y_max = 8;
+const int x_min = 4;
+const int y_min = 4;
+
+// Function to compute region code for a point(x, y)
+int computeCode(double x, double y)
+{
+ // initialized as being inside
+ int code = INSIDE;
+
+ if (x < x_min) // to the left of rectangle
+ code |= LEFT;
+ else if (x > x_max) // to the right of rectangle
+ code |= RIGHT;
+ if (y < y_min) // below the rectangle
+ code |= BOTTOM;
+ else if (y > y_max) // above the rectangle
+ code |= TOP;
+
+ return code;
+}
+
+// Implementing Cohen-Sutherland algorithm
+// Clipping a line from P1 = (x2, y2) to P2 = (x2, y2)
+void cohenSutherlandClip(double x1, double y1,
+ double x2, double y2)
+{
+ // Compute region codes for P1, P2
+ int code1 = computeCode(x1, y1);
+ int code2 = computeCode(x2, y2);
+
+ // Initialize line as outside the rectangular window
+ bool accept = false;
+
+ while (true) {
+ if ((code1 == 0) && (code2 == 0)) {
+ // If both endpoints lie within rectangle
+ accept = true;
+ break;
+ }
+ else if (code1 & code2) {
+ // If both endpoints are outside rectangle,
+ // in same region
+ break;
+ }
+ else {
+ // Some segment of line lies within the
+ // rectangle
+ int code_out;
+ double x, y;
+
+ // At least one endpoint is outside the
+ // rectangle, pick it.
+ if (code1 != 0)
+ code_out = code1;
+ else
+ code_out = code2;
+
+ // Find intersection point;
+ // using formulas y = y1 + slope * (x - x1),
+ // x = x1 + (1 / slope) * (y - y1)
+ if (code_out & TOP) {
+ // point is above the clip rectangle
+ x = x1 + (x2 - x1) * (y_max - y1) / (y2 - y1);
+ y = y_max;
+ }
+ else if (code_out & BOTTOM) {
+ // point is below the rectangle
+ x = x1 + (x2 - x1) * (y_min - y1) / (y2 - y1);
+ y = y_min;
+ }
+ else if (code_out & RIGHT) {
+ // point is to the right of rectangle
+ y = y1 + (y2 - y1) * (x_max - x1) / (x2 - x1);
+ x = x_max;
+ }
+ else if (code_out & LEFT) {
+ // point is to the left of rectangle
+ y = y1 + (y2 - y1) * (x_min - x1) / (x2 - x1);
+ x = x_min;
+ }
+
+ // Now intersection point x, y is found
+ // We replace point outside rectangle
+ // by intersection point
+ if (code_out == code1) {
+ x1 = x;
+ y1 = y;
+ code1 = computeCode(x1, y1);
+ }
+ else {
+ x2 = x;
+ y2 = y;
+ code2 = computeCode(x2, y2);
+ }
+ }
+ }
+ if (accept) {
+ cout << "Line accepted from " << x1 << ", "
+ << y1 << " to " << x2 << ", " << y2 << endl;
+ // Here the user can add code to display the rectangle
+ // along with the accepted (portion of) lines
+ }
+ else
+ cout << "Line rejected" << endl;
+}
+
+// Driver code
+int main()
+{
+ // First Line segment
+ // P11 = (5, 5), P12 = (7, 7)
+ cohenSutherlandClip(5, 5, 7, 7);
+
+ // Second Line segment
+ // P21 = (7, 9), P22 = (11, 4)
+ cohenSutherlandClip(7, 9, 11, 4);
+
+ // Third Line segment
+ // P31 = (1, 5), P32 = (4, 1)
+ cohenSutherlandClip(1, 5, 4, 1);
+
+ return 0;
+}
+