Задача D. Два шара

Автор:Maxim Kuzin   Ограничение времени:60 сек
Входной файл:input.txt   Ограничение памяти:256 Мб
Выходной файл:output.txt  
Максимальный балл:100  

Условие

Вам поручено провести важное научное исследование — изучить упругое столкновение двух тел. Чтобы упростить задачу, вам предлагается сцена в Unity с двумя шарами. В этой сцене уже реализована механика движения и столкновения тел. Все, что вам осталось сделать — это написать дополнительный скрипт, который засекает определенное время и выводит координаты мячей после моделирования их движения в течении этого времени. Для взаимодействия со сценой вы можете использовать любые функции Unity, а также дополнительный объект — controller. Однако, весь ваш код должен находиться в классе Solution. Другие изменения в сцене учитываться не будут.

Объект controller предоставляет следующие функции для работы со сценой:

Изначально система находится на паузе. Обратите внимание, что шары начнут двигаться сами, как только вы вызовете метод controller.Resume(). Также, заметьте, что требуемое время моделирования может быть достаточно большим. Шары двигаются без трения и ускорения.

Проект https://github.com/Supermagzzz/NTI_TASK1, Вам осталось реализовать класс Solution.

Вы можете тестировать свои решения, изменяя данные, содержащиеся в файле input.txt в репозитории проекта.

Формат входного файла

Входной файл содержит пять строк. В первой строке содержится требуемое время моделирования t. Во второй и третьей строке содержатся координаты первого и второго шаров, соответственно xi, yi, zi. В четвертой и пятой строке содержатся начальные скорости первого и второго шаров, соответственно vx, vy, vz. Все числа во входном файле вещественные. Реализовывать считывание данных с файла input.txt не нужно. Для получения данных используйте функции, реализованные в controller.

Формат выходного файла

Файл с решением должен содержать реализацию класса Solution. Координаты, полученные с помощью вашего решения, должны иметь погрешность не больше одной единицы в координатах Unity. Реализовывать вывод в файл output.txt не нужно. Для вывода ответа используйте метод setAnswer(), описанный выше.

Ограничения

0 ≤ t ≤ 105

1000 ≤ xi, zi ≤ 1000

1000 ≤ vx, vz ≤ 1000

yi = 0.5, vy = 0

Примеры тестов

Входной файл (input.txt) Выходной файл (output.txt)
1
10
-5 0.5 0
5 0.5 0
5 0 1
-5 0 1
-46.00008
0.5005372
9.999964
45.9999
0.5
9.999917

Разбор

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

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


0.089s 0.012s 13