170 likes | 393 Views
Лекция. анимация. Анимация. Анимация - дискретные изменения вида или расположения объекта, которые кажутся нам непрерывными. Для этого: Изменения должны быть маленькими. Изменения должны происходить часто. Плохая анимация. Такая " анимация " парализует пользовательский интерфейс.
E N D
Лекция анимация
Анимация Анимация - дискретные изменения вида или расположения объекта, которые кажутся нам непрерывными. Для этого: • Изменения должны быть маленькими. • Изменения должны происходить часто.
Плохая анимация Такая "анимация" парализует пользовательский интерфейс. intdx = 1;// сдвиг в пикселях // Метод изменяет расположение кнопки void Step() { // Когда кнопка у вертикальной стенки, меняется направление сдвига if (button1.Right > Width || button1.Left < 0) dx = -dx; button1.Left += dx; } privatevoid button1_Click(object sender, EventArgs e) { for (; ; ) Step(); }
Класс Timer Объект System.Windows.Forms.Timer является источником повторяющихся событий. Точность определения интервала времени между событиями составляет 55 мс. Timertimer = newTimer(); timer.Interval = 40; timer.Tick += timer1_Tick; timer.Start();
Хорошая анимация intdx = 10; void Step() { if (button1.Right > Width || button1.Left < 0) dx = -dx; button1.Left += dx; } privatevoid timer1_Tick(object sender, EventArgs e) { Step(); } privatevoid button1_Click(object sender, EventArgs e) { timer1.Start(); // Good movie } Другие коллекции
Физика (17 век) a = f / m Знание закона движения f(x, v) и начальных условий (x0, v0) позволяет определить положение тела в любой момент времени. Теория Практика ∆v/ ∆t = a = f / m ∆v = f * (∆t/ m) ------------------------ v' = v + ∆v x' = x + ∆v * ∆t x = x0; v = v0; for (;;) { v += f(x, v); x +=v; //... }
Одномерное движение V = V + F(X, V) X = X + V По инерции: f = 0 В однородном поле: f = const Упругие колебания: f = - k * x
Одномерная модель classBody1D { publicfloat X; publicfloat V; publicfloat R = 20; publicvoid Step(float F) { V += F; X += V; } }
Буферизация рисования Создаем пустой Image по размеру картинки. Направляем графический вывод в него. Рисуем Image методомDrawImageUnscaled().
Двумерное движение Vx = Vx + Fx/m Vy = Vy + Fy/m X = X + Vx Y = Y + Vy
Двумерная модель classBody { publicfloat X, Y; // координаты publicfloatVx, Vy; // скорость publicfloat R = 20; // радиус publicSize Box;// границы publicvoid Step(floatFx, floatFy) { if (X < 0 || X > Box.Width) Vx = -Vx; if (Y < 0 || Y > Box.Height) Vy = -Vy; Vx += Fx; Vy += Fy; X += Vx; Y += Vy; } }
Движение в центральном поле В центральном поле: F = c * R/ (r * r * r) F и R – векторы F V R
Трансформации Графический вывод всегда претерпевает трансформацию. Мы этого не замечали, т.к. по умолчанию установлена тождественная трансформация.
Виды трансформаций • Сдвиг: x' = x + Dx, y' = y + Dy, • Растяжение : x' = Kx * x, y' =Ky* y • Поворот: x'= x * cos(α) - y * sin(α);y'= y * cos(α) + x * sin(α); Для задания любой трансформации достаточно шести чисел: Dx,Dy, Kx,Ky, sin(α), cos(α)
Программирование трансформаций Первый способ. Вычислить 6 чисел и создать экземпляр класса Matrics. Присвоить этот экземпляр свойству Graphics.Transform. Второй способ. Последовательно выполнить некоторые из методов Graphics: • TranslateTransform • ScaleTransform • RotateTransform • ResetTransform
Поворот вокруг точки Graphicsg = CreateGraphics(); 1) g.TranslateTransform(dx, dy); 2) g.RotateTransform(fi); 3) g.DrawImageUnscaled(bar,-d,-d); 2) 1) 3)
Самостоятельно Сделать часы со стрелами, в том числе с секундной.