From 6ec61f84c354ed5c78a9782e678b425068fee846 Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Tue, 10 Nov 2020 00:01:05 +0300 Subject: =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=20=D0=BA=205=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task05/Guschin/Clip.h | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 task05/Guschin/Clip.h (limited to 'task05/Guschin/Clip.h') diff --git a/task05/Guschin/Clip.h b/task05/Guschin/Clip.h new file mode 100644 index 0000000..10a613a --- /dev/null +++ b/task05/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