From 7be113983ed5e8a499ece4bcdf8463c33c9a7b1b Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Sat, 28 Nov 2020 18:14:58 +0400 Subject: =?UTF-8?q?=D0=9F=D0=BE=D1=87=D0=B8=D0=BD=D0=B8=D0=BB=20Matrix.h?= =?UTF-8?q?=20=D0=B2=20=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B5=205=203D=20?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BE=D0=BF=D0=B8=D0=BB=D0=B8=D0=BB=20=D0=B5?= =?UTF-8?q?=D1=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task05_3D/Guschin/Matrix.h | 7 +- task05_3D/Guschin/MyForm.h | 166 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 168 insertions(+), 5 deletions(-) (limited to 'task05_3D/Guschin') diff --git a/task05_3D/Guschin/Matrix.h b/task05_3D/Guschin/Matrix.h index a47ee6e..e19a01f 100644 --- a/task05_3D/Guschin/Matrix.h +++ b/task05_3D/Guschin/Matrix.h @@ -64,7 +64,7 @@ public: { x *= v.x; y *= v.y; - a *= v.z; + z *= v.z; a *= v.a; return *this; } @@ -109,7 +109,7 @@ public: row1 = vec4(a, 0.f, 0.f, 0.f); row2 = vec4(0.f, a, 0.f, 0.f); row3 = vec4(0.f, 0.f, a, 0.f); - row3 = vec4(0.f, 0.f, 0.f, a); + row4 = vec4(0.f, 0.f, 0.f, a); } vec4& operator[](int i) @@ -129,7 +129,7 @@ public: const vec4 operator*(const vec4& v) { vec4* res = new(vec4); - for (int i = 0; i < 3; ++i) + for (int i = 0; i < 4; ++i) (*res)[i] = dot((*this)[i], v); return *res; } @@ -204,7 +204,6 @@ public: } }; - class mat2 { public: diff --git a/task05_3D/Guschin/MyForm.h b/task05_3D/Guschin/MyForm.h index b36ec18..0ba7758 100644 --- a/task05_3D/Guschin/MyForm.h +++ b/task05_3D/Guschin/MyForm.h @@ -45,7 +45,7 @@ namespace Guschin { // this->AutoScaleDimensions = System::Drawing::SizeF(8, 16); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; - this->ClientSize = System::Drawing::Size(737, 686); + this->ClientSize = System::Drawing::Size(464, 390); this->DoubleBuffered = true; this->KeyPreview = true; this->Margin = System::Windows::Forms::Padding(4); @@ -69,6 +69,7 @@ namespace Guschin { float Wx_part = 0.6, Wy_part = 0.6; float Wcx_work, Wcy_work; float Wz_work; + int numXsect = 5, numYsect = 5, numZsect = 5; private: System::Void rectCalc() { @@ -110,6 +111,64 @@ namespace Guschin { Pen^ rectPen = gcnew Pen(Color::Black, 2); g->DrawRectangle(rectPen, left, top, Wx, Wy); + // Отрисовка сетки + Pen^ gridPen = gcnew Pen(Color::Black, 1); + SolidBrush^ drawBrush = gcnew SolidBrush(Color::Black); + System::Drawing::Font^ drawFont = gcnew System::Drawing::Font("Arial", 8); + + // координатная сетка по x + float gridStep_x = Wx_work / numXsect; + float grid_dX = V_work.x / numXsect; + float tick_x = Vc_work.x; + + for (int i = 0; i <= numXsect; i++) + { + float tmpXCoord_d = Wcx + i * gridStep_x; + float tmpXCoord_v = Wcx_work + i * gridStep_x; + g->DrawLine(gridPen, tmpXCoord_d, Wcy, tmpXCoord_v, Wcy_work); + g->DrawLine(gridPen, tmpXCoord_v, Wcy_work, tmpXCoord_v, minY); + + if (i > 0 && i < numXsect) + g->DrawString(tick_x.ToString("F4"), drawFont, drawBrush, tmpXCoord_d, Wcy); + tick_x += grid_dX; + } + + // координатная сетка по z + gridStep_x = (Wx - Wx_work) / numZsect; + float gridStep_y = Wz_work / numZsect; + float grid_dZ = V_work.z / numZsect; + float tick_z = Vc_work.z; + + for (int i = 0; i <= numZsect; i++) + { + float tmpXCoord_v = Wcx_work - i * gridStep_x; + float tmpYCoord_g = Wcy_work + i * gridStep_y; + float tmpXCoord_g = tmpXCoord_v + Wx_work; + g->DrawLine(gridPen, tmpXCoord_v, tmpYCoord_g, tmpXCoord_v, tmpYCoord_g - Wy_work); + g->DrawLine(gridPen, tmpXCoord_v, tmpYCoord_g, tmpXCoord_g, tmpYCoord_g); + + if (i > 0 && i < numZsect) + g->DrawString(tick_z.ToString("F4"), drawFont, drawBrush, tmpXCoord_g, tmpYCoord_g); + tick_z += grid_dZ; + } + + // координатная сетка по y + gridStep_y = Wy_work / numYsect; + float grid_dY = V_work.y / numYsect; + float tick_y = Vc_work.y; + for (int i = 0; i <= numYsect; i++) + { + float tmpYCoord_d = Wcy - i * gridStep_y; + float tmpYCoord_g = Wcy_work - i * gridStep_y; + g->DrawLine(gridPen, Wcx, tmpYCoord_d, Wcx_work, tmpYCoord_g); + g->DrawLine(gridPen, Wcx_work, tmpYCoord_g, maxX, tmpYCoord_g); + + if (i > 0 && i < numYsect) + g->DrawString(tick_y.ToString("F4"), drawFont, drawBrush, maxX, tmpYCoord_g); + tick_y += grid_dY; + } + + // Отрисовка графика Pen^ pen = gcnew Pen(Color::Blue, 1); float deltaX = V_work.x / Wx_work; @@ -153,6 +212,7 @@ namespace Guschin { 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; @@ -197,19 +257,123 @@ namespace Guschin { switch (e->KeyCode) { case Keys::Escape: T = initT; + Wx_part = 0.6; + Wy_part = 0.6; + numXsect = 5; + numYsect = 5; + numZsect = 5; break; + case Keys::A: T = translate(-V_work.x / Wx, 0.f, 0.f) * T; break; + case Keys::D: + T = translate(V_work.x / Wx, 0.f, 0.f) * T; + break; + case Keys::S: + T = translate(0.f, -V_work.y / Wy, 0.f) * T; + break; + case Keys::W: + T = translate(0.f, V_work.y / Wy, 0.f) * T; + break; + case Keys::R: + T = translate(0.f, 0.f, -V_work.x / Wx) * T; + break; + case Keys::F: + T = translate(0.f, 0.f, V_work.x / Wx) * T; + break; + case Keys::Z: T = translate(-centerX, -centerY, -centerZ) * T; T = scale(1.1, 1.1, 1.1) * T; T = translate(centerX, centerY, centerZ) * T; break; + case Keys::X: + T = translate(-centerX, -centerY, -centerZ) * T; + T = scale(1/1.1, 1/1.1, 1/1.1) * T; + T = translate(centerX, centerY, centerZ) * T; + break; + + case Keys::Q: + if (Wx_part < 0.9) + Wx_part *= 1.1; + break; + case Keys::E: + if (Wx_part > 0.2) + Wx_part /= 1.1; + break; + + case Keys::C: + if (Wy_part < 0.9) + Wy_part *= 1.1; + break; + case Keys::V: + if (Wy_part > 0.2) + Wy_part /= 1.1; + break; + + case Keys::T: + T = translate(-centerX, -centerY, -centerZ) * T; + T = scale(1.1, 1.f , 1.f) * T; + T = translate(centerX, centerY, centerZ) * T; + break; + case Keys::G: + T = translate(-centerX, -centerY, -centerZ) * T; + T = scale(1/1.1, 1.f, 1.f) * T; + T = translate(centerX, centerY, centerZ) * T; + break; + + case Keys::Y: + T = translate(-centerX, -centerY, -centerZ) * T; + T = scale(1.f, 1.1, 1.f) * T; + T = translate(centerX, centerY, centerZ) * T; + break; + case Keys::H: + T = translate(-centerX, -centerY, -centerZ) * T; + T = scale(1.f, 1/1.1, 1.f) * T; + T = translate(centerX, centerY, centerZ) * T; + break; + + case Keys::U: + T = translate(-centerX, -centerY, -centerZ) * T; + T = scale(1.f, 1.f, 1.1) * T; + T = translate(centerX, centerY, centerZ) * T; + break; + case Keys::J: + T = translate(-centerX, -centerY, -centerZ) * T; + T = scale(1.f, 1.f, 1/1.1) * T; + T = translate(centerX, centerY, centerZ) * T; + break; + + case Keys::D1: + numXsect += 1; + break; + case Keys::D2: + if (numXsect > 3) + numXsect -= 1; + break; + + case Keys::D3: + numYsect += 1; + break; + case Keys::D4: + if (numYsect > 3) + numYsect -= 1; + break; + + case Keys::D5: + numZsect += 1; + break; + case Keys::D6: + if (numZsect > 3) + numZsect -= 1; + break; + default: break; } worldRectCalc(); + rectCalc(); Refresh(); } }; -- cgit v1.2.3