diff options
Diffstat (limited to 'task05_3D/Guschin/MyForm.h')
| -rw-r--r-- | task05_3D/Guschin/MyForm.h | 166 |
1 files changed, 165 insertions, 1 deletions
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(); } }; |