Главная Случайная страница


Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






Лабораторная работа «Простейшая анимация»

Цель лабораторной работы: изучить возможности Visual Studio по создание простейшей анимации. Написать и отладить программу, выводящую на экран анимационное изображение.

Работа с таймером

Класс для работы с таймером (Timer) формирует в приложении повторяющиеся события. События повторяются с периодичностью, указанной в миллисекундах, в свойстве Interval. Установка свойства Enabled в значение true запускает таймер. Каждый тик таймера порождает событие Tick, обработчик которого обычно и создают в приложении. В этом обработчике могут изменятся каике либо величины, и вызваться принудительная перерисовка окна. Напоминаем, что вся отрисовка при создании анимации должна находится в обработчике события Paint.

Создание анимации

Для создании простой анимации достаточно использовать таймер, при тике которого будут изменятся параметры изображения (например, координаты концов отрезка) и обрабочки события Paint для рисования по новым параметрам. При таком подходе не надо заботиться об удалении старого изображения (как в идеологии MS DOS), ведь оно создается в окне заново.

В качестве примера рассмотрим код анимации секундной стрелки часов:

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{ //описываем переменные достыпные в любом обработчике событий класса Form1

private int x1, y1, x2, y2, r;

private double a;

private Pen pen = new Pen(Color.DarkRed, 2);

 

public Form1()

{

InitializeComponent();

}

 

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics;

g.DrawLine(pen, x1, y1, x2, y2); //рисуем секундную стрелку

 

}

 

private void Form1_Load(object sender, EventArgs e)

{ //определяем цент экрана

x1 = ClientSize.Width / 2;

y1 = ClientSize.Height / 2;

r = 150; //задаем радиус

a = 0; //задаем угол поворота

//определяем конец часовой стрелки с учетом центра экрана

x2 = x1 + (int) (r * Math.Cos(a));

y2 = y1 - (int) (r * Math.Sin(a));

}

 

private void timer1_Tick(object sender, EventArgs e)

{

a -= 0.1;//уменьшаем угол на 0,1 радиану

//определяем конец часовой стрелки с учетом центра экрана

x2 = x1 + (int)(r * Math.Cos(a));

y2 = y1 - (int)(r * Math.Sin(a));

Invalidate(); //вынудительный вызов перерисовки (Paint)

}

}

}

 

Движение по траектории

Движение по траектории реализуется аналогично выше рассмотренному примеру. Для реализации движения по прямой приращиваются на определённые константы переменные, являющиеся узловыми точками (в примере переменные x2, y2). Для задания более сложно траектории можно использовать различные параметрические кривые. В случае движения на плоскости обычно изменению один параметр. Рассмотрим пример реализации движения окружности по декартову листу.

Декартов лист — плоская кривая третьего порядка, удовлетворяющая уравнению в прямоугольной системе . Параметр определяется как диагональ квадрата, сторона которого равна наибольшей хорде петли.

Рис. 7.1. Декартов лист

 

При переходе к параметрическому виду получаем:

,

где .

 

Программная реализация выглядит следующим образом:

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

private int x1, y1, x2, y2;

private double a, t, fi;

private Pen pen = new Pen(Color.DarkRed, 2);

 

public Form1()

{

InitializeComponent();

}

 

private void Form1_Load(object sender, EventArgs e)

{

x1 = ClientSize.Width / 2;

y1 = ClientSize.Height / 2;

a = 150;

fi = -0.5;

t = Math.Tan(fi);

x2 = x1 + (int)((3 * a * t) / (1 + t * t * t));

y2 = y1 - (int)((3 * a * t * t) / (1 + t * t * t));

 

}

 

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics;

g.DrawEllipse(pen, x2, y2, 20, 20);

}

 

private void timer1_Tick(object sender, EventArgs e)

{

fi += 0.01;

t = Math.Tan(fi);

x2 = x1 + (int)((3 * a * t) / (1 + t * t * t));

y2 = y1 - (int)((3 * a * t * t) / (1 + t * t * t));

Invalidate();

}

 

private void button1_Click(object sender, EventArgs e)

{

 

}

}

}

 

Описание ряда интересных кривых для создания траектории движения можно найти в «Википедии» в статье «Циклоидальная кривая».

Задание по лабораторной работе

Изучите с помощью справки MSDN методы и свойства классов Graphics, Color, Pen и SolidBrush. Создайте собственное приложение для анимации в соответствии с индивидуальным заданием.

 

1) Создайте программу движения окружности по циклоиде.

2) Разработайте программу движения окружности по гипоциклоиде при k=3, k=4, k=6, k=2,1, k=5,5

3) Создайте программу движения окружности по эпициклоиде при различных значениях k.

4) Разработайте программу отображающую процесс построения гипотрохоиды.

5) Создайте программу моделирующую построение кривых с помощью спирографа. R, r, d задаются произвольно.

6) Создайте программу, показывающую движение окружности по синусоиде.

7) Создайте приложение, отображающее движение окружности по спирали.

8) Разработайте программу движения окружности по трактрисе (кривой погони).

9) Создайте программу, показывающую движение окружности по трисектрисе Каталана(Кубика Чирнгауза).

10) Разработайте программу, отображающую процесс построения фигур Лиссажу, с произвольными задаваемыми параметрами.

11) Разработайте приложение, отображающее процесс построения связанных звезд, с произвольным числом вершин.

12) Создайте программу, отображающую движения маятника с затуханием.

13) Создайте программу анимирующую процесс построения различных спиралей (параболических, логарифмических, архимедовых спираль Корню, клотоида).

14) Разработайте программу, отображающую процесс построения Лемнискаты Бернулли.

15) Создайте программу движения объекта по кривой Персея при различных значениях a, b и с.

16) Разработайте программу движения точки вдоль кривой Безье четвертого порядка. Узловые точки задаются произвольно пользователем до построения кривой.

17) Разработайте программу анимации падения снежинки, которые падают по разным траекториям и с разными скоростями.

18) Разработайте программу анимации летающего бумеранга.

19) Создайте программу, показывающую падение нескольких звезд одновременно.

20) Создайте приложение, отображающее хаотичное движение звезды в окне.

21) Создайте программу, показывающую движение окружности вдоль многоугольника. Число вершин вводится пользователем до анимации.

22) Создайте приложение, отображающее броуновское движение молекулы в окне.

23) Разработайте программу анимации движения планет в солнечной системе.

24) Создайте программу, показывающую движение квадратика по траектории, состоящей из 100 точек, и хранящихся в специальном массиве.

Последнее изменение этой страницы: 2016-06-10

lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда...