如何找到反射光线以匹配目标点的角度

这是我正在制作的一个坦克游戏的需求

请看图片以获得更清晰的想法:链接文本

我想预先计算精确的角度以击中 T2 点。

T1:起始点

T2:目标点

V1(a,b):线

反射点:这是我正在寻找的:)

编辑:如果能看到一些“代码”就好了:p


回答:

了解光线/向量在反射过程中会发生什么变化很有用。维基百科为此提供了一张很好的图片:

reflection

在上面的图片中,对于一个完美的反射,两个角度是相同的

现在,这和您有什么关系呢? 让我们再次看一下您的情况。

fancy diagram

请注意,由于反射定律,角度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:

给定:
  A (射击坦克到墙的距离)
  B (目标坦克到墙的距离)
  P (两点之间的 x 距离)
查找:
  C (射击坦克到墙被击中的 x 距离)

A / (A+B) = C / P
C = A*P / (A+B)   <- 就在这里

例如,如果您的第一辆坦克位于(1,5),第二辆坦克位于(3,7),并且您的墙是 x 轴:

A = 5
B = 7
P = 3-1 = 2

因此:
C = 5*2 / (5+7)
  = 10/12
  = 5/6

因此,如果您的坦克想要击中位于(3,7)的坦克,则应该朝(0,5/6)射击。

对于更通用的解决方案:

如果墙是 X 轴,并且您的射击坦克位于 (s_x,s_y),
  并且击中坦克位于 (h_x,h_y),则要射击的点是:

[ s_x + s_y * (h_x-s_x) / (h_y + s_y), 0 ]

替代方案:具有任意墙壁位置/方向

上述解决方案的问题在于,您的墙壁必须是您的 x 轴。如果不是呢?

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

  1. 找到w,它是墙壁方向上的单位向量
  2. w找到v,它是垂直于墙壁的单位向量。如果w = [x,by]v = [-y,x]
  3. 找到r_s,它是从您的射击坦克到墙上任何已知点的向量。
  4. 找到r_h,它是从您的击中坦克到墙上任何已知点的向量。
  5. 距离A = | v . r_s |,其中.点积运算符。 这可以通过[l,m] . [n,o] = l*n + m*o找到
  6. 距离B = | v . r_h |

找到AB后,找到P,它是平行于墙壁的距离。 为此:

  1. 找到q,它是从击中坦克到射击坦克的向量
  2. 距离P = | w . q |

现在您有了ABP,您有两种方法可以解决:

  1. 找到墙上要瞄准的点,首先使用上述方法求解 C,然后找到从您的射击坦克开始的v与您的墙的交点,并将C*w添加到该交点。

  2. 您可以找到必须射击的角度(从v开始),它是P/(A+B)的反切线。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注