Отражение от других кругов
Для «правильного» отражения кругов друг от друга необходимо использовать гораздо более сложную формулу. Код, проверяющий соударение:
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. Из них на каждом шаре одновременно должны присутствовать два цвета: основной и дополнительный. Пример фигур, у которых основной цвет – желтый, дополнительный – красный, приведён ниже.
Варианты действий при соударении.
Шар меняет тип на «следующий». Если у шара был тип 0, он становиться типом 1. Тип 1 становится типом 2, тип 2 – типом 3, тип 3 – типом 0. Причем, при соударении двух шаров оба меняют свои типы.
Шар меняет цвет.
При соударении с другим шаром шары «обмениваются» цветами (основными и дополнительными). Например:
При соударении с краем экрана шары изменяют свой цвет (основной и дополнительный) на «следующий». Если основной цвет был зеленый(0), он станет синим(1). Синий(1) станет красным(2), красный(2) – желтым(3), желтый (3) – зеленым(0). С дополнительным цветом – аналогично. Основной и дополнительный цвета меняются независимо друг от друга.
Шар меняет скорость (замедляется или ускоряется). Если скорость шара по модулю ( ) меньше 60 px/сек, то она увеличивается на 10%, иначе уменьшается в 4 раза. Для увеличения скорости на 10% необходимо увеличить vx на 10% и увеличить vy на 10%. С уменьшением аналогично.
Шар меняет размер – уменьшает радиус на 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 |