0

我以向量的形式获得游戏中 5 个敌人的位置。根据我选择的距离,敌人的数量可以从 0 到 5 不等。我每次都需要知道它们的向量,以检查是否可以通过一定数量的英雄(向量)画一条直线。

在那之后,我的英雄将不得不使用他的能力叫墙。它由 2 个开始和结束向量组成。因此,检查我的英雄是否可以在线上的敌人上设置一堵墙来接住他们

假设我可以得到 3 个敌方英雄的位置。我需要弄清楚我是否可以直接穿过它们,以便对它们使用能力。

1

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

2

这是获取其中一位英雄的矢量 3

能力本身可以在某个点被扭曲。不过反正墙要碰几个英雄也是有必要的 4

无论我将鼠标移动到哪里,我都可以将它放在所需的位置。但不幸的是这需要很多时间,所以我想自动化 5

墙本身的坐标,或者更确切地说是它的两条边,我也可以得到,但只有在使用了能力之后 6

4

4 回答 4

0

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

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

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

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

描述线世界的齐次坐标向量对应于该矩阵的内核

当然,如果您的输入坐标是浮点数,则不太可能精确为零。据推测,这堵墙确实以某种方式允许一些错误,您需要告诉我们这一点,以便获得正确模拟这一方面的答案。同时,要知道上面行列式的绝对值与这三个点创建的三角形的面积成正比。因此,如果您要选择一个恒定的阈值,那么您的敌人沿着墙的方向相距越远,他们在不违反该阈值的情况下偏离直线的可能性就越小。

于 2021-06-06T20:07:35.970 回答
0

您可以描述属于线 (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) 和 (xd, yd) 之间的距离,即 (x2, y2) 和直线之间的距离,连接 (x0, y0) 和(x1, y1)。

知道这一点后,您可以选择带有 min_x 和 max_x 的点并计算线之间的距离,连接所述点和其余点。如果距离小于您选择的某个阈值,那么您可以假设您可以让线穿过所有点。

于 2021-06-07T10:28:13.080 回答
0

从你所说的有一个起点和一个终点,我认为你选择了两个敌人并想要在两者之间捕获任何东西。

所以你实际上不是在寻找一条可以穿过你的敌人位置的直线,而是如果他们在一个矩形内。无论如何,它们都共线是非常不可能的,而且对于更多的点来说几乎是不可能的。

所以它变得非常琐碎。您通过开始和结束敌人画一条线。然后你检查剩余的敌人到那条线的距离与你的 AoE 的宽度。Maye 您还想在该计算中处理一些身体宽度。

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

于 2021-06-07T08:42:10.817 回答
0

如果一个人更喜欢几何而不是线性代数......那么一个人可以计算(unit-vector1.Unit-Vector2)的点积。即等于它们之间夹角的 SIN。

因此,如果单位向量是目标 1 的射手位置,单位向量 2 是目标 2 的射手位置,等等……那么当 DOTPRODUCT(Vector1,vector2) = 1 且 DOTPRODUCT(Vector1,vector3) = 1 时,这三个点在 syzygy .

并从射手重复到尽可能多的目标,以确定部分或所有点是否在 syzygy 中。

于 2021-06-06T21:32:23.870 回答