diff --git a/src/BranchChecker.c.orig b/src/BranchChecker.c.orig new file mode 100644 index 000000000..4ed0be9eb --- /dev/null +++ b/src/BranchChecker.c.orig @@ -0,0 +1,187 @@ + +// C++ program to implement Cohen Sutherland algorithm +// for line clipping. +#include +#include "BranchChecker.h" + +// 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 +int x_max; +int y_max; +int x_min; +int y_min; + +void setRectangle(int x_M, int y_M, int x_m, int y_m) { + x_max = x_M; + x_min = x_m; + y_max = y_M; + y_min = y_m; +} + +// 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 + printf("L\n"); + code |= LEFT; + } + else if (x > x_max) { // to the right of rectangle + printf("R\n"); + code |= RIGHT; + } + if (y < y_min) { // below the rectangle + printf("B\n"); + code |= BOTTOM; + } + else if (y > y_max) { // above the rectangle + printf("y: %f, y_max: %f\n", y, y_max); + printf("T\n"); + code |= TOP; + } + + return code; +} + +// Implementing Cohen-Sutherland algorithm +// Clipping a line from P1 = (x2, y2) to P2 = (x2, y2) +double* cohenSutherlandClip(double x1, double y1, + double x2, double y2, double rectangle0, double rectangle1, double rectangle2, double rectangle3) +{ + setRectangle(rectangle0, rectangle1, rectangle2, rectangle3); + // Compute region codes for P1, P2 + printf("%f %f %f %f\n", x1, y1, x2, y2); + int code1 = computeCode(x1, y1); + int code2 = computeCode(x2, y2); + + printf("code1: %d code2: %d\n", code1, code2); + + double* clippedLine = (double*)malloc(sizeof(double) * 4); + + // Initialize line as outside the rectangular window + bool accept = false; + + for (int i = 0; i < 8; i++) { + + if ((code1 == 0) && (code2 == 0)) { // && (code2 == 0) Condition add + // If both endpoints lie within rectangle + printf("T code1: %d code2: %d\n", code1, code2); + accept = true; + break; + } + else if (code1 & code2) { //original: code1 & code2 + printf("F code1: %d code2: %d\n", 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) { //original: 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 = (y2 - y1) * (x_max - x1) / (x2 - x1) + y1; //Original + y = (y2 - y1) * (x_max - x1) / (x2 - x1) + 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); // Original +// y = x1 + (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 (i > 4) { + clippedLine[0] = 0; + clippedLine[1] = 0; + clippedLine[2] = 0; + clippedLine[3] = 0; + printf("Line rejected\n"); + return clippedLine; + } + } + clippedLine[0] = x1; + clippedLine[1] = y1; + clippedLine[2] = x2; + clippedLine[3] = y2; + if (accept) { + printf("Line accepted from %f, %f to %f, %f\n", x1, y1, x2, y2); + // Here the user can add code to display the rectangle + // along with the accepted (portion of) lines + } + else { + clippedLine[0] = 0; + clippedLine[1] = 0; + clippedLine[2] = 0; + clippedLine[3] = 0; + printf("Line rejected\n"); + } + + + return clippedLine; +} + +// 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; +//} diff --git a/src/BranchChecker.c.rej b/src/BranchChecker.c.rej new file mode 100644 index 000000000..554e0d1ff --- /dev/null +++ b/src/BranchChecker.c.rej @@ -0,0 +1,13 @@ +--- __backup0 2022-08-01 07:55:49.564013224 +0000 ++++ src/BranchChecker.c 2022-08-01 08:02:06.603910651 +0000 +@@ -114,7 +114,9 @@ + else if (code_out & RIGHT) { +- y = (y2 - y1) * (x_max - x1) / (x2 - x1) + x1; ++ y = (y2 - y1) * (x_max - x1) / (x2 - x1) + (rectangle1); ++; ++ + x = x_max; + } + else if (code_out & LEFT) { + +