summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Guschin <saintruler@gmail.com>2020-11-10 01:46:23 +0300
committerAndrew Guschin <saintruler@gmail.com>2020-11-10 01:46:23 +0300
commita32f056fbf26af81db0f8b43d2086e3306a170b5 (patch)
treed2f2b1ff9f055c9f88975966d1d8eb569e7bbc85
parentaa5790807ad039c1c9db01f7a96f5f643dd56b45 (diff)
Добавил ещё больше трёхмерности
-rw-r--r--task05_3D/Guschin/MyForm.h110
-rw-r--r--task05_3D/Guschin/Transform.h2
2 files changed, 68 insertions, 44 deletions
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;
}