Tervezzünk animációt a Föld Nap körüli pályán való mozgásának modellezésére
A feladat időkezeléséhez a Timer eszköz timer1 objektumpéldányát használjuk, melynek Interval tulajdonságát 100-ra állítottuk be. A timer1_Tick eseménykezelő mozgatja a Földet a Nap körül. Kör, Vonal és a Tárgy osztályokat használtuk a feladat megoldásához.
A feladat megoldása
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Targy pt = null;
int szog = 0, dszog = -1; // fok
// START, az animáció indítása,
// illetve a STOP után az animáció folytatása
private void button1_Click(object sender, EventArgs e)
{
int xk = this.ClientSize.Width / 2;
int yk = this.ClientSize.Height / 2;
pt = new Targy(xk, yk, 20);
pt.Rajzol(this);
timer1.Interval = 50;
timer1.Start();
}
// STOP, az animáció működésének felfüggesztés
private void button2_Click(object sender, EventArgs e)
{
timer1.Stop();
szog = (szog - dszog) % 360;
}
private void timer1_Tick(object sender, EventArgs e)
{
szog = (szog + dszog) % 360;
pt.Mozog(this, szog * Math.PI / 180.0);
}
private void Form1_Load(object sender, EventArgs e)
{
this.BackColor = Color.Blue;
}
// KILÉPÉS a programból
private void button3_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void Form1_FormClosing(object sender,
FormClosingEventArgs e)
{
e.Cancel = true;
DialogResult dlgres;
dlgres = MessageBox.Show("Valóban ki akar lépni?",
"Figyelem",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (dlgres == DialogResult.Yes)
{
e.Cancel = false;
}
}
}
class Kor
{
public int x, y, r;
public Kor(int x0, int y0, int r0)
{
x = x0; y = y0;
r = r0;
}
public void Mozog(int x0, int y0, int r0)
{
x = x0; y = y0;
r = r0;
}
public void Rajzol(Form1 form)
{
Graphics g = form.CreateGraphics();
Rectangle t = new Rectangle(new Point(x - r,
y - r), new Size(2 * r, 2 * r));
g.FillEllipse(Brushes.Lime, t);
}
public void Torol(Form1 form)
{
Graphics g = form.CreateGraphics();
Rectangle t = new Rectangle(new Point(x - r,
y - r), new Size(2 * r, 2 * r));
g.FillEllipse(Brushes.Blue, t);
}
}
class Vonal
{
public int x, y, xv, yv;
public Vonal(float x0, float y0, float xv0, float yv0)
{
x = (int)x0; y = (int)y0;
xv = (int)xv0; yv = (int)yv0;
}
}
class Targy
{
public Kor Nap, Fold;
public Vonal[] v;
public Targy(int x, int y, int r)
{
Nap = new Kor(x, y, r);
Fold = new Kor(0, 0, 0);
v = new Vonal[4];
v[0] = new Vonal(x - 1.5f * r, y - 1.5f * r,
x + 1.5f * r, y + 1.5f * r);
v[1] = new Vonal(x - 1.5f * r, y + 1.5f * r,
x + 1.5f * r, y - 1.5f * r);
v[2] = new Vonal(x - 2 * r, y, x + 2 * r, y);
v[3] = new Vonal(x, y - 2 * r, x, y + 2 * r);
}
public void Rajzol(Form1 form)
{
Graphics g = form.CreateGraphics();
for (int i = 0; i < 4; i++)
{
g.DrawLine(Pens.Yellow, new Point(v[i].x,
v[i].y), new Point(v[i].xv, v[i].yv));
}
Rectangle t = new Rectangle(new Point(Nap.x –
Nap.r, Nap.y - Nap.r),
new Size(2 * Nap.r, 2 * Nap.r));
g.FillEllipse(Brushes.Yellow, t);
}
public void Mozog(Form1 form, double szog)
{
const int er1 = 200, er2 = 100;
Fold.Torol(form);
int xFold = (int)(Nap.x + er1 * Math.Cos(szog));
int yFold = (int)(Nap.y - er2 * Math.Sin(szog));
Fold.Mozog(xFold, yFold, 10);
Fold.Rajzol(form);
}
A program futási eredményei: