diff options
Diffstat (limited to 'works/life/computer-graphics-experiment/3.cpp')
-rw-r--r-- | works/life/computer-graphics-experiment/3.cpp | 144 |
1 files changed, 0 insertions, 144 deletions
diff --git a/works/life/computer-graphics-experiment/3.cpp b/works/life/computer-graphics-experiment/3.cpp deleted file mode 100644 index 2526d5d..0000000 --- a/works/life/computer-graphics-experiment/3.cpp +++ /dev/null @@ -1,144 +0,0 @@ -// 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; -} - |