From 73c6ec80c71dd43125b6a9b00dd9e940b827f29f Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Tue, 10 Nov 2020 01:15:07 +0300 Subject: =?UTF-8?q?=D0=A0=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B8=D0=BB=205=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D1=83=20=D0=BD=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=B2=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task05_3D/Guschin/Clip.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 task05_3D/Guschin/Clip.h (limited to 'task05_3D/Guschin/Clip.h') 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 + +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; +} -- cgit v1.2.3