summaryrefslogtreecommitdiff
path: root/task05_3D/Guschin/Clip.h
diff options
context:
space:
mode:
Diffstat (limited to 'task05_3D/Guschin/Clip.h')
-rw-r--r--task05_3D/Guschin/Clip.h54
1 files changed, 54 insertions, 0 deletions
diff --git a/task05_3D/Guschin/Clip.h b/task05_3D/Guschin/Clip.h
new file mode 100644
index 0000000..10a613a
--- /dev/null
+++ b/task05_3D/Guschin/Clip.h
@@ -0,0 +1,54 @@
+#pragma once
+#include "Matrix.h"
+#include <algorithm>
+
+unsigned int codeKS(vec2 P, float minX, float minY, float maxX, float maxY) {
+ unsigned int code = 0;
+
+ if (P.x < minX) {
+ code += 1;
+ }
+ else if (P.x > maxX) {
+ code += 2;
+ }
+ if (P.y < minY) {
+ code += 4;
+ }
+ else if (P.y > maxY) {
+ code += 8;
+ }
+
+ return code;
+}
+
+bool clip(vec2 & A, vec2 & B, float minX, float minY, float maxX, float maxY) {
+ unsigned int codeA = codeKS(A, minX, minY, maxX, maxY);
+ unsigned int codeB = codeKS(B, minX, minY, maxX, maxY);
+ while (codeA | codeB) {
+ if (codeA & codeB) {
+ return false;
+ }
+ if (codeA == 0) {
+ std::swap(A, B);
+ std::swap(codeA, codeB);
+ }
+ if (codeA & 1) {
+ A.y = A.y + (B.y - A.y) * (minX - A.x) / (B.x - A.x);
+ A.x = minX;
+ }
+ else if (codeA & 2) {
+ A.y = A.y + (B.y - A.y) * (maxX - A.x) / (B.x - A.x);
+ A.x = maxX;
+ }
+ else if (codeA & 4) {
+ A.x = A.x + (B.x - A.x) * (minY - A.y) / (B.y - A.y);
+ A.y = minY;
+ }
+ else {
+ A.x = A.x + (B.x - A.x) * (maxY - A.y) / (B.y - A.y);
+ A.y = maxY;
+ }
+ codeA = codeKS(A, minX, minY, maxX, maxY);
+ }
+ return true;
+}