Как найти угол отраженного луча, чтобы соответствовать точке - PullRequest
1 голос
/ 24 июня 2010

это для игры с танками, которую я делаю

Пожалуйста, см. Рис для ясной идеи: текст ссылки

Я хочу предварительно вычислить точный угол для попадания в точку Т2.

T1: точка начала

T2: целевая точка

V1 (a, b): строка

точка отражения: это то, что я ищу:)

Редактировать: было бы здорово увидеть какой-нибудь "Код": p

Ответы [ 2 ]

5 голосов
/ 25 июня 2010

Было бы полезно посмотреть, что происходит с линиями / векторами во время отражения.Википедия дает хорошую картинку для этого:

reflection

Где, на этой картинке, в правильном отражении, оба угла одинаковы .

Теперь, какое это имеет отношение к вам?Давайте еще раз посмотрим на вашу ситуацию.

Причудливая диаграмма 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:

  1. Найти w, чтоэто единичный вектор в направлении стены.
  2. С w найдите v, который представляет собой единичный вектор перпендикулярно стене.Если w = [x,by], v = [-y,x].
  3. Find r_s, который является вектором от вашего стрелкового танка до любой известной точки на вашей стене.
  4. Find r_h, который являетсявектор от вашего танка до любой известной точки на вашей стене.
  5. Расстояние A = | v . r_s |, где . - оператор dot product .Это можно найти по [l,m] . [n,o] = l*n + m*o
  6. Расстояние B = | v . r_h |

Как только вы найдете A и B, найдите P, что расстояние, параллельноестена.Для этого:

  1. Найти q, который является вектором от танка удара до стрелкового танка
  2. Расстояние P = | w . q |

Теперь, когда у вас есть A, B и P, у вас есть два пути:

  1. Найдите точку на стене, к которой нужно стремиться, сначала решив дляC в методе выше, а затем найти пересечение v, начиная с вашего стрелкового танка и вашей стены, и добавив C*w к этой точке пересечения.

  2. Вы можете найти угол(из v), который вы должны стрелять, и это обратная касательная к P/(A+B).

1 голос
/ 24 июня 2010

Отразите T2 на другой стороне V1, используя V1 в качестве оси отражения (мы назовем эту новую точку T2 '); Линия между T1 и T2 'будет пересекать V1 в нужной точке. С этой точки зрения просто определить тригонометрию, чтобы выяснить, какие есть углы.

http://en.wikipedia.org/wiki/Transformation_%28geometry%29#Reflection

...