Найти в Дзене

Scratch3. Моделируем в Scratch. Часть 6. Столкновение двух движущихся объектов на плоскости.

Продолжим тему моделирования. В этом проекте мы будем наблюдать за траекторией движения двух мячей, хаотично катающихся по прямоугольной области сцены в разных направлениях. Мячи будут отскакивать от её границ под действием сил упругости, периодически сталкиваться друг с другом и отскакивать с изменением скорости и направления движения. Для сохранения наглядности не будем перегружать проект подробностями. В частности, столкновения мячей со стенками и друг с другом будут абсолютно упругими, мы будем учитывать лишь небольшое вязкое трение при свободном перемещении мячей. Нам понадобится большое количество второстепенных переменных для расчётов. В целом будет проще начать "с чистого листа". Создайте в среде Scratch новый проект, удалите спрайт кота. Добавьте уже знакомый нам спрайт "Ball". Нам надо будет отредактировать его костюмы. Удалите все костюмы, кроме синего и зелёного ("ball-b" и "ball-d"). Для упрощения расчётов воспользуемся маленькой хитростью: если сделать размер изображения

Продолжим тему моделирования.

В этом проекте мы будем наблюдать за траекторией движения двух мячей, хаотично катающихся по прямоугольной области сцены в разных направлениях. Мячи будут отскакивать от её границ под действием сил упругости, периодически сталкиваться друг с другом и отскакивать с изменением скорости и направления движения.

Для сохранения наглядности не будем перегружать проект подробностями. В частности, столкновения мячей со стенками и друг с другом будут абсолютно упругими, мы будем учитывать лишь небольшое вязкое трение при свободном перемещении мячей.

Нам понадобится большое количество второстепенных переменных для расчётов. В целом будет проще начать "с чистого листа".

Создайте в среде Scratch новый проект, удалите спрайт кота. Добавьте уже знакомый нам спрайт "Ball". Нам надо будет отредактировать его костюмы.

Удалите все костюмы, кроме синего и зелёного ("ball-b" и "ball-d"). Для упрощения расчётов воспользуемся маленькой хитростью: если сделать размер изображения равным 100x100 пикселей, тогда не придётся пересчитывать проценты в пиксели. Блок "Размер", возвращающий масштаб отображения спрайта, можно будет использовать как диаметр мяча.

Увеличьте размер костюма "ball-b" инструментом "выбор" так, чтобы он стал равен 100x100. Затем передвиньте костюм в центр. В графическом редакторе Scratch3 сделать это легко: разработчики позаботились о том, чтобы изображение "прилипало" к центральной точке.

-2

Повторите операцию для зелёного костюма "ball-d". Теперь оба костюма имеют размер 100x100.

У нас будет два мяча - синий и зелёный, каждый мяч будет использовать свой собственный костюм. Один спрайт будет называться "Синий", второй - "Зелёный". Эти названия будут фигурировать в скриптах проекта. Сделайте дубль спрайта мяча, переименуйте оба спрайта, выберите им костюмы.

-3

Вначале мы создадим все скрипты для спрайта "Синий", а затем сдублируем их в спрайт "Зелёный" и немножко подправим.

Первым делом необходимо создать набор переменных, которые потребуются нам для расчётов. Очень важно, чтобы все переменные были локальными ("только для этого спрайта"), в противном случае проект будет работать неправильно, и будет сложно понять, почему.

Создайте локальные переменные "масса", "скорость", "sin_Dir", "cos_Dir", "dfrm", "dir_to_object", "dX", "dY", "vX", "vY" и "tmp".

-4

Ниже приведены необходимые скрипты, которые следует создать. Для подробного объяснения, как они работают, потребовалось бы много времени. Укажем лишь, что в программе осуществляется пересчёт линейной скорости и направления движения мяча в горизонтальную и вертикальную составляющую, а затем обратно. Кроме того, можно менять масштаб отображения спрайта и регулировать тем самым его условную массу (при масштабе 100 масса равна единице).

При возникновении проблем рекомендуется отлаживать программу по частям. Например, можно отключить скрипт, отвечающий за проверку столкновений с зелёным мячом. В этом случае синий будет игнорировать наличие другого мяча и отскакивать лишь от границ сцены (либо от границ меньшей области на сцене, если мы захотим). Удобнее работать так: первым делом создать все пользовательские блоки с пустыми поначалу определениями, а затем добавлять скрипты, "подклеивая" и к "шапочкам" (заголовкам). Неважно, что тот или иной блок ещё "пустой", скрипт с его использованием уже можно собирать.

-5

Основной скрипт:

-6

Блоки "пересчёт скорости при столкновениях" и "проверка столкновений с границами":

-7

Блоки "скорость и направление в vX и vY" и " vX и vY в скорость и направление":

-8

Блок "проверка столкновений с другим мячом":

-9

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

-10

Сдублируйте все скрипты в спрайт "Зелёный". Затем выберите его, щёлкните правой кнопкой мыши по свободному месту поля скриптов и дайте команду "Очистить блоки".
"Очистить" в данном случае означает "разместить в столбик".

-11

Внимательно проверьте, что удалось сдублировать все скрипты и нет лишних дублей.

Осталось поправить блок "проверка столкновений с другим мячом", заменить везде "Зелёный" на "Синий". Будьте внимательны, при этой процедуре зачастую меняется и название блока "размер от ( )" (например, на "положение X от ( )"). Блок "проверка столкновений с другим мячом" спрайта "Зелёный" должен выглядеть в итоге так.

-12

Можно также несколько поменять размер
одного из мячей или обоих. Запустите программу. Движение мячей по сцене
должно выглядеть примерно так:

-13

В заключение необходимо отметить, что мы никак специально не следим за соблюдением закона сохранения импульса двух движущихся тел после столкновения. Напротив, он "сам собой" естественным образом вытекает из логики работы программы.

На всякий случай, готовый файл проекта можно забрать из электронной библиотеки проекта. Файл с готовым проектом на данном этапе: этап5.sb3

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

Ранее в проекте:

1. Scratch3. Моделируем в Scratch гармонические колебания. Часть 1. Введение в проект.

2. Scratch3. Моделируем в Scratch гармонические колебания. Часть 2. Перемещение, скорость, ускорение.

3. Scratch3. Моделируем в Scratch гармонические колебания. Часть 3. Учитываем силы трения и сопротивления.

4. Scratch3. Моделируем в Scratch. Часть 4. Свободное движение по инерции с повторяющимися упругими столкновениями.

5. Scratch3. Моделируем в Scratch. Часть 5. Изменение скорости мяча при столкновении с движущимся массивным препятствием.