如何通过三个向量判断是否能够画一条直线

我在游戏中得到了5个敌人的向量位置。根据所选距离,敌人的数量可以从0到5不等。每一次我需要知道他们的向量位置,以便判断是否可以通过一定数量的英雄(向量)画一条直线。

之后,我的英雄将使用他的名为“wall”的能力。它由2个起始向量和结束向量组成。因此,需要判断我的英雄是否可以在直线上放置一堵墙来追捕他们。

假设我可以获取3个敌方英雄的位置。我需要找出是否可以直接穿过他们,以便在他们身上使用能力。

1

这是在游戏中使用能力的样子

2

这里是获取其中一个英雄向量的示例 3

能力本身可以在某个点扭曲。但无论如何,必须使墙接触到几个英雄 4

无论我移动鼠标到哪里,都可以将其放置在所需位置。但不幸的是,这需要很长时间,因此我希望自动化 5

墙本身的坐标,或者更确切地说是两个边缘的坐标,只能在使用完能力后获得 6

点赞
用户1468366
用户1468366

在平面上的任何一条线都可以用方程 a*x + b*y + c = 0 来描述,其中 (a, b) ≠ (0, 0)。请注意,如果您有这种形式的方程,则将每个系数 a,b,c 与相同的数字相乘会产生描述同一直线的方程。这就是为什么 (a,b,c) 被称为该行的齐次坐标向量的原因。

如何找到 a,b,c?一种简单的方法是将其视为三个未知数的三个线性方程。您为所有三个点插入 xy 坐标,并获得 ac 的三个方程。但是,有一个问题。由于每个方程的右手边都是零,因此 a = b = c = 0 总是一个解。在那些只有一个解的情况下,那就是它。因此,为了有一条线,您需要多于一个解。确定一组方程是否具有多于一个解的数学工具是行列式。如果系统没有单个唯一解,则行列式为零。

长话短说:如果三个点共线(在一条线上),则

    ⎛x1 y1 1⎞
det ⎜x2 y2 1⎟ = 0
    ⎝x3 y3 1⎠

描述该行的齐次坐标向量应该对应于该矩阵的

当然,如果您的输入坐标是浮点数,则精确的零不太可能。假定该围墙以某种方式允许某些误差,您需要告诉我们以正确地进行建模。与此同时,需要知道上述行列式的绝对值与这三个点创建的三角形的面积成比例。因此,如果您选择一个恒定的阈值值,则敌人在围墙方向上越远,它们就越不能偏离直线而不违反该阈值。

2021-06-06 20:07:35
用户6599487
用户6599487

如果更喜欢几何学而不是线性代数...

那么可以计算(单位向量1.单位向量2)的点积。这相当于它们之间的正弦值。

因此,如果单位向量是从射手位置到目标1的向量,单位向量2是从射手到目标2的向量,等等... 那么当DOTPRODUCT(Vector1,Vector2)= 1且DOTPRODUCT(Vector1,Vector3)= 1时,这三个点处于相位交会。

然后,从射击手到尽可能多的目标重复此过程,以确定某些或所有点是否处于相位交会。

2021-06-06 21:32:23
用户2858170
用户2858170

根据您的陈述,我理解您选择了两个敌人,并想要将它们之间的所有东西都困住。

因此,您实际上并不是在寻找可以通过敌人位置连接的直线,而是一个矩形。对于更多的点,它们几乎不可能都共线。

所以这变得非常简单。你通过起点和终点敌人画一条直线。然后,您检查其余敌人到该直线的距离与您的 AoE 宽度之间的差距。您可能还需要在该计算中考虑一些身体宽度。

https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line

2021-06-07 08:42:10
用户4070330
用户4070330

你可以描述所有属于线段 (x0, y0) + (dx, dy) t = (x1, y1) 的点。选择任意两个点和t为1,就可以得到连接两个点的直线的 (dx, dy)。现在您需要找到这条直线和 (x2, y2) 之间的距离,它是 (x2, y2) 和 (xd, yd) 之间的距离,其中一方面 (xd, yd) = (x0, y0) + t1(dx, dy),另一方面 (xd, yd) = (x2, y2) + t2*(-dy, dx)。解这两个方程,您将找到 t1、t2、(xd, yd) 和 (x2, y2) 与连接 (x0, y0) 和 (x1, y1) 的直线之间的距离。

了解了这一点,您可以选择 min_x 和 max_x 的点,并计算连接这些点的线与其余点之间的距离。如果距离小于您选择的某个阈值,则可以假定您可以通过所有点绘制直线。

2021-06-07 10:28:13