Я не собираюсь давать вам ответ, я уверен, что это полезно или даже правильно, но здесь это идет:
Поиграв с Mathematica немного больше (проверьте конец ответа для записной книжки / опубликованной записной книжки), это решение кажется правильным, даже если бы оно считалось не лучшим с точки зрения эффективности.
Я написал это в Mathematica, которая соответствует вашей проблеме. В основном это решает уравнения / неравенства для переменной OA, что нам нужно выяснить. Выходные данные дадут нам возможные решения, которые может иметь ОА, и условия, которые необходимо проверить для каждого решения, чтобы оно было действительным:
Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {OA}]
{BPx, BPy} - текущая позиция синего
{BVx, BVy} - вектор скорости синего цвета
{OPx, OPy} - позиция маркера апельсина
OV - норма вектора скорости пули апельсина (общая скорость)
ОА - угол пули апельсина (угол вектора скорости)
t время, необходимое для попадания пули в синий цвет
Я попытался поставить t> 0 && OV> 0 в условиях, но mathematica заняла бы вечность, поэтому я просто использовал t! = 0 && OV! = 0. Так что решения, которые я собираюсь здесь дать, просто работают, когда синий не точно та же позиция, что и у апельсина, и когда пуля апельсина действительно движется (вместо того, чтобы стоять на месте)
Вывод гигантский: http://freetexthost.com/xzhhpr5e2w
Однако, если мы извлечем части OA == _, мы получим это:
http://freetexthost.com/iyrhqoymfo
Это те значения, которые может иметь ОА (для каждого из них требуются разные условия).
После некоторого дальнейшего анализа решений, требующих отрицательного значения OV, чего мы не хотим, я получил следующее:
http://freetexthost.com/iy4wxepeb6
Так что это возможные решения проблемы, для каждого из которых требуются разные условия. Чтобы определенный угол ОА был действительным решением, должны соблюдаться следующие условия:
Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {t}]
Выход:
(BVy - OV Sin[OA] != 0 && BPx == (BPy BVx + BVy OPx - BVx OPy - BPy OV Cos[OA] + OPy OV Cos[OA] - OPx OV Sin[OA])/(BVy - OV Sin[OA]) && t == (-BPy + OPy)/(BVy - OV Sin[OA]) && BPy OV - OPy OV != 0) ||
(BVy == OV Sin[OA] && BPy == OPy && BVx - OV Cos[OA] != 0 && t == (-BPx + OPx)/(BVx - OV Cos[OA]) && BPx OV - OPx OV != 0) ||
(BVy == OV Sin[OA] && BVx == OV Cos[OA] && BPy == OPy && BPx == OPx && OV t != 0)
Поэтому рассмотрите только те решения, в которых это подтверждается (вам не нужно проверять части t == _. Это те, которые дают вам время, необходимое для того, чтобы пуля попала в автомобиль, если выполняются другие условия. Обратите внимание, что если t приводит к отрицательному значению, вы не можете рассматривать данный OA как правильное решение, даже если оно проверяет другие условия (это потому, что мы использовали t! = 0 вместо t> 0 при уменьшении)).
Это также может быть хорошей идеей, чтобы спросить об этом в /math// .
редактировать
Я заинтересовался этим вопросом, поэтому создал записную книжку с графической демонстрацией всего, что я объяснил. Загрузите это здесь:
http://www.2shared.com/file/pXhYyhN1/towerBullets.html
Или здесь:
http://www.2shared.com/file/W01g4sST/towerBullets.html
(это опубликованная версия, и вам нужен только проигрыватель mathematica, который может просматривать его бесплатно. Если у вас нет mathematica, это путь)
Скриншот: