Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




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

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

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

 

// Глобальные переменные

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

private double a;

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

 

// Перерисовка формы

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)

{

r = 150; // Радиус стрелки

a = 0; // Угол поворота стрелки

// Определяем центр формы – начало стрелки

x1 = ClientSize.Width / 2;

y1 = ClientSize.Height / 2;

// Конец стрелки

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));

// Принудительный вызов события Paint

Invalidate();

}

 

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

В случае движения на плоскости обычно изменению подвергается один параметр. Рассмотрим пример реализации движения окружности по декартову листу. Декартов лист – это плоская кривая третьего порядка, удовлетворяющая уравнению в прямоугольной системе x3+y3=3·a·x·y. Параметр 3·a определяется как диагональ квадрата, сторона которого равна наибольшей хорде петли.

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

 

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

 

,

где t=tg φ.

 

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

 

private int x1, y1, x2, y2;

private double a, t, fi;

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

 

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();

}

 

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

Индивидуальное задание

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

2) Создайте приложение, отображающее вращающийся винт самолета.

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

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

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

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

7) Создайте программу, показывающую скачущий мячик.

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

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

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

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

12) Разработайте программу анимации взлета ракеты. Старт осуществляется по нажатию специальной «красной» кнопки.

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

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

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

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

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

18) Разработайте программу анимации падения несколько листков с дерева. Движение не должно быть линейным.

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

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

 

Лабораторная работа №12
Обработка изображений

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




Поделиться с друзьями:


Дата добавления: 2014-11-07; Просмотров: 1953; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.