diff options
| author | Andrew Guschin <saintruler@gmail.com> | 2020-11-10 01:06:41 +0300 |
|---|---|---|
| committer | Andrew Guschin <saintruler@gmail.com> | 2020-11-10 01:06:41 +0300 |
| commit | 9c0e1d4fdf65bf2c0d160ad2509ae33fd1f784c6 (patch) | |
| tree | 81046eec0842a95c60130efe4524a11b9e744058 | |
| parent | b52138db4c8e86c6d365c8cc90ebfdb7070ce259 (diff) | |
Изменил отрисовку графика на более точную
| -rw-r--r-- | task05/Guschin/MyForm.h | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/task05/Guschin/MyForm.h b/task05/Guschin/MyForm.h index de76ae6..207294e 100644 --- a/task05/Guschin/MyForm.h +++ b/task05/Guschin/MyForm.h @@ -80,7 +80,11 @@ namespace Guschin { } float f(float x) { - return x * sin(x); + return tan(x); + } + bool f_exists(float x, float delta) + { + return fabs(2.f * acos(cos(x)) - Math::PI) > delta; } private: System::Void MyForm_Resize(System::Object^ sender, System::EventArgs^ e) { @@ -96,28 +100,39 @@ namespace Guschin { g->DrawRectangle(rectPen, left, top, Wx, Wy); Pen^ pen = gcnew Pen(Color::Blue, 1); + float deltaX = V_work.x / Wx; - vec2 start; + bool hasStart, hasEnd; + vec2 start, end; float x, y; + start.x = Wcx; x = Vc_work.x; - y = f(x); - start.y = Wcy - (y - Vc_work.y) / V_work.y * Wy; + hasStart = f_exists(x, deltaX); + if (hasStart) + { + y = f(x); + start.y = Wcy - (y - Vc_work.y) / V_work.y * Wy; + } while (start.x < maxX) { - vec2 end; end.x = start.x + 1.f; x += deltaX; - y = f(x); - end.y = Wcy - (y - Vc_work.y) / V_work.y * Wy; + hasEnd = f_exists(x, deltaX); + if (hasEnd) + { + y = f(x); + end.y = Wcy - (y - Vc_work.y) / V_work.y * Wy; + } vec2 tmpEnd = end; - bool visible = clip(start, end, minX, minY, maxX, maxY); + bool visible = hasStart && hasEnd && clip(start, end, minX, minY, maxX, maxY); if (visible) { g->DrawLine(pen, start.x, start.y, end.x, end.y); } start = tmpEnd; + hasStart = hasEnd; } } private: @@ -131,13 +146,25 @@ namespace Guschin { } private: System::Void MyForm_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) { + float centerX = Vc_work.x + V_work.x / 2; + float centerY = Vc_work.y + V_work.y / 2; + switch (e->KeyCode) { case Keys::Escape: T = initT; break; + case Keys::A: + T = translate(-V_work.x / Wx, 0.f) * T; + break; + case Keys::Z: + T = translate(-centerX, -centerY) * T; + T = scale(1.1) * T; + T = translate(centerX, centerY) * T; + break; default: break; } + worldRectCalc(); Refresh(); } }; |