Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
8RGR_animatsia.doc
Скачиваний:
2
Добавлен:
19.07.2019
Размер:
195.58 Кб
Скачать

Отражение от других кругов

Для «правильного» отражения кругов друг от друга необходимо использовать гораздо более сложную формулу. Код, проверяющий соударение:

SBall B1; // описание шара 1

SBall B2; // описание шара 2

// код пересчитывающий скорости при столкновении

// новые координаты

double B1x_New = B1.x + dt*B1.vx;

double B1y_New = B1.y + dt*B1.vy;

// растояние между центрами шаров

double Distance = sqrt((B2.x-B1x_New)*(B2.x-B1x_New)+

(B2.y-B1y_New)*(B2.y-B1y_New));

// проверяем столкновение

if(Distance <= B1.radius+B2.radius)

{

// Вспомогательные расчеты

double nx = (B2.x-B1x_New)/Distance;

double ny = (B2.y-B1y_New)/Distance;

double nv1 = nx*B1.vx + ny*B1.vy;

double lv1 = ny*B1.vx - nx*B1.vy;

double nv2 = nx*B2.vx + ny*B2.vy;

double lv2 = ny*B2.vx - nx*B2.vy;

// пересчет скоростей

B1.vx = nx*nv2 + ny*lv1;

B1.vy = ny*nv2 - nx*lv1;

B2.vx = nx*nv1 + ny*lv2;

B2.vy = ny*nv1 - nx*lv2;

}

Гравитация

Один из дополнительных факторов влияющий на скорость – гравитация. Если просто гравитация – это постоянное направленное ускорение, действующее на объект. Гравитация действует на объект с одной из сторон (например, снизу). Для ее обработки достаточно использовать известную физическую формулу . a – собственно ускорение.

Для примера рассмотри действие гравитации снизу. Она действует только на vy. Поэтому будем пересчитывать только этот компонент.

vy = vy + a*dt;

Под действием это силы шарик начнет «падать» и при достижении нижнего края отразится от него и полетит снова вверх. Должен получиться эффект прыгающего мячика.

Вязкость

Вязкость – это фактически «сила трения» или некоторый коэффициент замедления. Она не направлена, поэтому влияет на все составляющие скорости сразу. Определяется формулой похожей на формулу гравитации . Где k – коэффицент вязкости. Важное отличие – вязкость всегда уменьшает скорость по модулю, но сохраняет знак. Т.е. вязкость именно замедляет объект.

vx = vx > 0 ? vx – k*dt : vx + k*dt;

vy = vy > 0 ? vy – k*dt : vy + k*dt;

Вращение (Дополнительно задание)

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

Удаление объектов мышью (Дополнительно задание)

При клике мышью на объект он должен удалиться (Подсказка. Достаточно его не отрисовывать).

Описание сцены и описание объекта

Описание сцены должно содержать:

  • Общую информацию.

    • Цвет фона

    • Размер окна

    • Коэффициент вязкости k

    • Силу гравитации снизу g

  • Описание объектов

    • Количество объектов (не больше 100)

    • Описание объектов

Каждый объект описывается следующим набором:

  • Тип. Определяет изображение внутри круга (см. описание вариантов).

  • Основной и дополнительный цвета

  • Радиус

  • Начальное положение (x и y)

  • Начальная скорость (vx и vy).

Работа с файлами

При запуске программа должна считывать из файла scene.txt исходное состояние объектов и запускать анимацию.

При нажатии на клавишу «S» программа должна сохранить текущее состояние сцены в файл save.txt.

При нажатии на клавишу «L» программа должна считать сохраненное состояние сцены из файла save.txt и запустить анимацию с сохраненного места.

Файлы scene.txt и save.txt должны содержать полное описание сцены (см. выше). И при этом быть удобными для изменения.

Описание вариантов

Варианты типов шариков

Таким образом, в каждом варианте 4 типа шарика. Каждый тип имеет свой индекс (от 0 до 3). Например, в первом варианте звездочка имеет индекс 1.

Цвета

Для рисования шаров будут использоваться только 4 цвета: зеленый(0), синий(1), красный(2), желтый(3). Для простоты обозначим их индексами от 0 до 3. Из них на каждом шаре одновременно должны присутствовать два цвета: основной и дополнительный. Пример фигур, у которых основной цвет – желтый, дополнительный – красный, приведён ниже.

Варианты действий при соударении.

  1. Шар меняет тип на «следующий». Если у шара был тип 0, он становиться типом 1. Тип 1 становится типом 2, тип 2 – типом 3, тип 3 – типом 0. Причем, при соударении двух шаров оба меняют свои типы.

  2. Шар меняет цвет.

    1. При соударении с другим шаром шары «обмениваются» цветами (основными и дополнительными). Например:

    1. При соударении с краем экрана шары изменяют свой цвет (основной и дополнительный) на «следующий». Если основной цвет был зеленый(0), он станет синим(1). Синий(1) станет красным(2), красный(2) – желтым(3), желтый (3) – зеленым(0). С дополнительным цветом – аналогично. Основной и дополнительный цвета меняются независимо друг от друга.

  1. Шар меняет скорость (замедляется или ускоряется). Если скорость шара по модулю ( ) меньше 60 px/сек, то она увеличивается на 10%, иначе уменьшается в 4 раза. Для увеличения скорости на 10% необходимо увеличить vx на 10% и увеличить vy на 10%. С уменьшением аналогично.

  2. Шар меняет размер – уменьшает радиус на 10%. Но чтобы размер шара был не меньше 20 px (после 20 px размер перестает уменьшаться).

Таблица вариантов:

Номер варианта

Типы шаров

Действие при столкновении

с краем

с другим шаром

1

1

1

2

2

2

1

2

3

3

1

2

4

1

1

3

5

2

1

3

6

3

1

3

7

1

1

4

8

2

1

4

9

3

1

4

10

1

2

1

11

2

2

1

12

3

2

1

13

1

2

3

14

2

2

3

15

3

2

3

16

1

2

4

17

2

2

4

18

3

2

4

19

1

3

1

20

2

3

1

21

3

3

1

22

1

3

2

23

2

3

2

24

3

3

2

25

1

3

4

26

2

3

4

27

3

3

4

28

1

4

1

29

2

4

1

30

3

4

1

31

1

4

2

32

2

4

2

33

3

4

2

34

1

4

3

35

2

4

3

36

3

4

3

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]