Есть пушка с координатами
(x1, y1) и игрок с координатами
(x2, y2). Пушка стреляет под некоторым углом
a к горизонту. Существует некоторое ускорение падения для ядра
g. Необходимо найти такую начальную скорость ядра, чтобы оно, вылетев из пушки, прилетело по месту, где в момент выстрела находился игрок. Если бы пушка и игрок находились на одной высоте, то задача была бы тривиальна. Формулу ниже я вывел сам:
float v = std::sqrt(std::abs(player->getCenterX() - this->position.x) * AccelerationInAir / 2 / std::sin(Angle * M_PIf / 180) / std::cos(Angle * M_PIf / 180));
Но она, очевидно, не работает, если игрок и пушка находятся на разных высотах, что в платформере происходит приблизительно всегда. Попытавшись вывести формулу для общего случая, я пришел к какому-то жесткому уравнению четвертой степени с множителями огромной длины. Возможно, пошел каким-то не тем путем.
P.S. В голову приходила идея написать бинпоиск, но по-моему это вообще уж чушь какая-то.