summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--task05/Guschin/MyForm.h43
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();
}
};