From a32f056fbf26af81db0f8b43d2086e3306a170b5 Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Tue, 10 Nov 2020 01:46:23 +0300 Subject: =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B5?= =?UTF-8?q?=D1=89=D1=91=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20=D1=82?= =?UTF-8?q?=D1=80=D1=91=D1=85=D0=BC=D0=B5=D1=80=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task05_3D/Guschin/MyForm.h | 110 +++++++++++++++++++++++++----------------- task05_3D/Guschin/Transform.h | 2 +- 2 files changed, 68 insertions(+), 44 deletions(-) (limited to 'task05_3D/Guschin') diff --git a/task05_3D/Guschin/MyForm.h b/task05_3D/Guschin/MyForm.h index 369f2e8..0809914 100644 --- a/task05_3D/Guschin/MyForm.h +++ b/task05_3D/Guschin/MyForm.h @@ -64,6 +64,10 @@ namespace Guschin { float minY = top, maxY; float Wcx = left, Wcy; float Wx, Wy; + float Wx_work, Wy_work; + float Wx_part = 0.6, Wy_part = 0.6; + float Wcx_work, Wcy_work; + float Wz_work; private: System::Void rectCalc() { @@ -72,6 +76,12 @@ namespace Guschin { Wcy = maxY; Wx = maxX - left; Wy = maxY - top; + + Wx_work = Wx_part * Wx; + Wy_work = Wy_part * Wy; + Wcx_work = maxX - Wx_work; + Wcy_work = minY + Wy_work; + Wz_work = Wcy - Wcy_work; } System::Void worldRectCalc() { @@ -101,57 +111,71 @@ namespace Guschin { Pen^ pen = gcnew Pen(Color::Blue, 1); - float deltaX = V_work.x / Wx; - bool hasStart, hasEnd; + float deltaX = V_work.x / Wx_work; + float deltaZ = V_work.z / Wz_work; + float deltaWcx = (Wcx_work - Wcx) / Wz_work; + + bool hasStart; float z = Vc_work.z; - vec2 start, end; - float x, y; + float Wcx_w = Wcx_work, Wcy_w = Wcy_work; - start.x = Wcx; - x = Vc_work.x; - hasStart = f_exists(x, z, deltaX); - if (hasStart) + while (Wcy_w <= Wcy) { - y = f(x, z); - start.y = Wcy - (y - Vc_work.y) / V_work.y * Wy; - } - - float deltaY; - float red, green, blue; - while (start.x < maxX) - { - end.x = start.x + 1.f; - x += deltaX; - hasEnd = f_exists(x, z, deltaX); - if (hasEnd) + vec2 start, end; + float x, y; + + start.x = Wcx_w; + x = Vc_work.x; + hasStart = f_exists(x, z, deltaX); + if (hasStart) { y = f(x, z); - deltaY = (y - Vc_work.y) / V_work.y; - end.y = Wcy - deltaY * Wy; + start.y = Wcy_w - (y - Vc_work.y) / V_work.y * Wy_work; } + + float maxX = Wcx_w + Wx_work; + while (start.x < maxX) + { + vec2 end; + bool hasEnd; + float deltaY; + float red, green, blue; + end.x = start.x + 1.f; + x += deltaX; + hasEnd = f_exists(x, z, deltaX); + if (hasEnd) + { + y = f(x, z); + deltaY = (y - Vc_work.y) / V_work.y; + end.y = Wcy_w - deltaY * Wy_work; + } - vec2 tmpEnd = end; - bool visible = hasStart && hasEnd && clip(start, end, minX, minY, maxX, maxY); - if (visible) { - if (deltaY > 1.f) deltaY = 1.f; - if (deltaY < 0.f) deltaY = 0.f; - green = 510.f * deltaY; - if (deltaY < 0.5) - { - blue = 255.f - green; - red = 0.f; - } - else - { - blue = 0.f; - red = green - 255.f; - green = 510.f - green; - } - pen->Color = Color::FromArgb(red, green, blue); - g->DrawLine(pen, start.x, start.y, end.x, end.y); + vec2 tmpEnd = end; + bool visible = hasStart && hasEnd && clip(start, end, minX, minY, maxX, maxY); + if (visible) { + if (deltaY > 1.f) deltaY = 1.f; + if (deltaY < 0.f) deltaY = 0.f; + green = 510.f * deltaY; + if (deltaY < 0.5) + { + blue = 255.f - green; + red = 0.f; + } + else + { + blue = 0.f; + red = green - 255.f; + green = 510.f - green; + } + pen->Color = Color::FromArgb(red, green, blue); + g->DrawLine(pen, start.x, start.y, end.x, end.y); + } + start = tmpEnd; + hasStart = hasEnd; } - start = tmpEnd; - hasStart = hasEnd; + Wcy_w += 1.f; + Wcx_w -= deltaWcx; + z += deltaZ; } } private: diff --git a/task05_3D/Guschin/Transform.h b/task05_3D/Guschin/Transform.h index 474ffb4..d1b0af5 100644 --- a/task05_3D/Guschin/Transform.h +++ b/task05_3D/Guschin/Transform.h @@ -30,7 +30,7 @@ mat4 scale(float Sx, float Sy, float Sz) mat4* res = new mat4(1.f); (*res)[0][0] = Sx; (*res)[1][1] = Sy; - (*res)[2][2] = Sy; + (*res)[2][2] = Sz; return *res; } -- cgit v1.2.3