diff options
| author | Andrew Guschin <saintruler@gmail.com> | 2020-11-10 01:15:07 +0300 |
|---|---|---|
| committer | Andrew Guschin <saintruler@gmail.com> | 2020-11-10 01:15:07 +0300 |
| commit | 73c6ec80c71dd43125b6a9b00dd9e940b827f29f (patch) | |
| tree | cc3efa28497fe78f925522deedc772e930e11f1d /task05_3D/Guschin/Clip.h | |
| parent | 70a1711e877ba980e094ef66925568ee94afc3af (diff) | |
Разделил 5 задачу на два проекта
Diffstat (limited to 'task05_3D/Guschin/Clip.h')
| -rw-r--r-- | task05_3D/Guschin/Clip.h | 54 |
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; +} |