Было бы полезно посмотреть, что происходит с линиями / векторами во время отражения.Википедия дает хорошую картинку для этого:
Где, на этой картинке, в правильном отражении, оба угла одинаковы .
Теперь, какое это имеет отношение к вам?Давайте еще раз посмотрим на вашу ситуацию.
Причудливая диаграмма http://img59.imageshack.us/img59/7939/reflector.png
Обратите внимание, что из-за законов отражения углы a
и b
равны.Это хорошо для нас, потому что, если мы знаем это, мы знаем, что c
и d
также равны!(Это прямоугольные треугольники)
Итак, мы знаем:
a = b
c = d
Мы скоро поймем, что у нас подобных треугольников .Это означает, что соответствующие стороны пропорциональны друг другу.Значение математически:
A / C = B / D
A / B = C / D
A / (A+B) = B / (A+B) = C / P = D / P
Итак, если вы знаете A
и B
, что вам следует, вы можете найти вашу точку отражения , добавив C
к xзначение пересечения.
Вы можете найти C следующим образом:
Given:
A (distance from shooting tank to wall)
B (distance from target tank to wall)
P (x distance between points)
Find:
C (x distance from shooting tank where wall is to be hit)
A / (A+B) = C / P
C = A*P / (A+B) <- here it is
Например, если ваш первый резервуар находится на (1,5)
, а ваш второй резервуар на (3,7)
, иваша стена - ось x:
A = 5
B = 7
P = 3-1 = 2
therefore:
C = 5*2 / (5+7)
= 10/12
= 5/6
Таким образом, ваш танк должен стрелять в направлении (0,5/6)
, если он хочет ударить по танку в (3,7)
.
Для более общего решения:
if the wall is the X axis, and you have shooting tank at (s_x,s_y)
and hit tank at (h_x,h_y), the point to be shot at is:
[ s_x + s_y * (h_x-s_x) / (h_y + s_y), 0 ]
Альтернатива, с произвольным расположением / направлением стены
Проблема с вышеупомянутым решением состоит в том, что ваша стена должна быть вашей осью x.Что, если это не так?
Сначала вам нужно найти расстояние от каждой точки до стены - A
и B
:
- Найти
w
, чтоэто единичный вектор в направлении стены. - С
w
найдите v
, который представляет собой единичный вектор перпендикулярно стене.Если w = [x,by]
, v = [-y,x]
. - Find
r_s
, который является вектором от вашего стрелкового танка до любой известной точки на вашей стене. - Find
r_h
, который являетсявектор от вашего танка до любой известной точки на вашей стене. - Расстояние
A = | v . r_s |
, где .
- оператор dot product .Это можно найти по [l,m] . [n,o] = l*n + m*o
- Расстояние
B = | v . r_h |
Как только вы найдете A
и B
, найдите P
, что расстояние, параллельноестена.Для этого:
- Найти
q
, который является вектором от танка удара до стрелкового танка - Расстояние
P = | w . q |
Теперь, когда у вас есть A
, B
и P
, у вас есть два пути:
Найдите точку на стене, к которой нужно стремиться, сначала решив дляC в методе выше, а затем найти пересечение v
, начиная с вашего стрелкового танка и вашей стены, и добавив C*w
к этой точке пересечения.
Вы можете найти угол(из v
), который вы должны стрелять, и это обратная касательная к P/(A+B)
.