UniLecs #174. Го-о-ол!

UniLecs #174. Го-о-ол!

UniLecs
Матч Россия - Хорватия, 7 июля 2018 года
На 115-й минуте четвертьфинального матча ЧМ FIFA 2018 Россия-Хорватия Алан Дзагоев бьёт в сторону ворот хорватов. Мяч летит немного мимо, но вдруг Марио Фернандес ударяет головой по мячу, и забивает в ворота соперников. Восторга зрителей нет предела, ведь именно в этот момент у нашей сборной появился шанс попасть в полуфинал!

Для упрощения примем, что Фернандес ударил по мячу не с усилием, а просто подставил голову, чтобы тот отрикошетил (и этот удар был абсолютно упругим, если это важно), Дзагоев бил с «центральной линии» (т.е. с линии, перпендикулярной линии ворот и проходящей через центр ворот), и мяч пересёк линию ворот тоже точно в центре (бывает же такое). Радиус головы Фернандеса нас не интересует, а радиус мяча учитывать не будем (примем его равным нулю), как и всяческие силы трения, направление вращения мяча и всё прочее 😁

Задача: даные следующие данные: 

  • расстояние D от линии ворот до Дзагоева;
  • расстояние F от линии ворот до точки X касания мяча с головой Фернандеса;
  • расстояние (смещение) S точки X влево от центральной линии. 

Числа D и F неотрицательные, S может быть любым.

Необходимо найти угол α в градусах(!) в точке X между отрезками ломаной, по которой летел мяч. Угол должен быть положительным и не превышать 180 градусов.

Пример: D = 10 м, F = 5 м, S = 5 м; 

Ответ α = 90 градусов.

Разбор: Разделим угол α на две части прямой, параллельной линии ворот и проходящей через точку X (по рисунку – горизонтальной линией). Найдём каждый из этих углов через арктангенс и сложим их:

Чтобы перевести угол из радианов в градусы, нужно лишь умножить результат на 180/π.

Во избежание деления на ноль предварительно сравним значение S с нулём и вернём в случае совпадения значение 180°.

Реализация:

Python

https://gist.github.com/unilecs/3e35a4475b2fe6130bfb13b926fd5f98

Play-test: https://repl.it/@unilecs/WildRobustPyramid

Report Page