如何找到反射光线的角度以匹配一个点

时间:2010-06-24 19:44:35

标签: math artificial-intelligence trigonometry

这是我正在制作的坦克游戏

请参阅图片了解明确的想法:link text

我想预先计算exacte角度以达到T2点。

T1:点开始

T2:指向目标

V1(a,b):行

反映点:这就是我要找的东西:)

编辑:看到一些“代码”会很酷:p

2 个答案:

答案 0 :(得分:5)

查看反射过程中线条/矢量会发生什么变得很有用。维基百科为此提供了一个很好的图片:

reflection

在这张照片中,在适当的反射中,两个角度相同

现在,这与你有什么关系?让我们再看看你的情况。

fancy diagram http://img59.imageshack.us/img59/7939/reflector.png

请注意,由于反射定律,角度ab相等。这对我们有好处,因为如果我们知道这一点,我们知道cd也是平等的! (它们是直角三角形)

所以我们知道:

a = b
c = d

我们很快意识到我们有类似的三角形。意思是,相应的边与彼此成比例。意思是,数学上:

A / C = B / D
A / B = C / D
A / (A+B) =  B / (A+B) = C / P = D / P

所以,如果您知道AB,那么您可以通过将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轴。如果不是怎么办?

首先,您需要找到从每个点到墙的距离 - AB

  1. 查找w,这是墙上方向的unit vector
  2. w,找到v,这是垂直于墙的单位矢量。如果w = [x,by]v = [-y,x]
  3. 查找r_s,这是从你的射击坦克到你墙上任何已知点的矢量。
  4. 查找r_h,这是从您的命中坦克到您墙上任何已知点的矢量。
  5. 距离A = | v . r_s |,其中.dot product运营商。这可以通过[l,m] . [n,o] = l*n + m*o
  6. 找到
  7. 距离B = | v . r_h |
  8. 找到AB后,找到P,这是与墙壁平行的距离。要做到这一点:

    1. 查找q,这是从命中坦克到射击坦克的向量
    2. 距离P = | w . q |
    3. 现在您有ABP,您有两种方法可以:

      1. 找到墙上的目标,首先在上面的方法中求解C,然后找到从你的射击坦克和你的墙开始的v的交点,并添加{{1到那个交叉点。

      2. 您可以找到必须拍摄的角度(来自C*w),它是v的反正切。

答案 1 :(得分:1)

在V1的另一侧反射T2,使用V1作为反射轴(我们将这个新点称为T2'); T1和T2'之间的线将在您想要的点处与V1相交。从这一点来看,需要通过简单的三角法来确定任何角度。

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