summaryrefslogtreecommitdiff
path: root/task05_3D/Guschin/MyForm.h
diff options
context:
space:
mode:
authorAndrew Guschin <saintruler@gmail.com>2020-11-28 18:14:58 +0400
committerAndrew Guschin <saintruler@gmail.com>2020-11-28 18:14:58 +0400
commit7be113983ed5e8a499ece4bcdf8463c33c9a7b1b (patch)
tree201d74bcb0b426586ad0441101b3e92e91e0501b /task05_3D/Guschin/MyForm.h
parentd5defd81ab822f677678325883bf2f40a890b10c (diff)
Починил Matrix.h в Задаче 5 3D и допилил её
Diffstat (limited to 'task05_3D/Guschin/MyForm.h')
-rw-r--r--task05_3D/Guschin/MyForm.h166
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();
}
};