1

我正在研究一些人工智能,我希望我的人工智能不会遇到给定的坐标,因为这些是墙/边界的参考。

首先,每次我的 AI 撞墙时,它都会引用那个位置 (x, y)。当它击中同一面墙三次时,它使用线性检查点来“想象”有一堵墙穿过这些坐标。

我现在想阻止我的 AI 再次进入那堵墙。

为了检测我的坐标是否成直线,我使用:

private boolean collinear(double x1, double y1, double x2, double y2, double x3, double y3) {
    return (y1 - y2) * (x1 - x3) == (y1 - y3) * (x1 - x2);
}

如果给定的点彼此线性,则返回 true。

所以我的问题是:

  1. 如何确定我的机器人是否正在从其当前轨迹接近墙壁?

  2. 不是 Java 的“想象”,而是从 1 到 3 的一条线。但是要“想象”一条线一直穿过这些线性坐标,直到无穷大(或接近)。

我有一种感觉,这将需要一些令人困惑的三角函数?

4

2 回答 2

0

对于#2,您可以检查任何点与您想要的墙壁/线上的一点之间的斜率是否与线上两点之间的斜率相同。

private boolean onWall(double x, double y, double wallX1, double wallY1, double wallX2, double wallY2) {
    return (wallY1 - y) / (wallX1 - x) == (wallY2 - wallY1) / (wallX2 / wallX1);
}

所以,计算的斜率共享一个点,所以如果它们相同,它们都在同一条线上。

于 2012-11-24T15:56:02.497 回答
0

有趣的问题。好吧,我想到了两种方法:

  • 因此,您可以做的是,一旦检测到每条线,就按照 line存储其斜率m和线常数。因此,一旦您将坐标更改为新坐标。把你的新方程放在上面的方程中,看看是否。整个操作在计算上将是昂贵的,因为每个新坐标移动检测到的线数是多少cy= mx +c(x1,y1)y1 == m*x1 + cO(n)n

您可以通过对点进行聚类并根据聚类而不是每条线检查线匹配来减少上述情况。即存储所有线路通过集群的内容,并仅在您当前位于相应集群中时检查这些线路。这应该是一个理想的解决方案

  • r另一种解决方案是在当前点周围有一个假想的半径圆。获得圆后,找出所有通过当前集群的线(如上所述)。对于每一个新动作,检查墙壁或不仅仅是那些线条。移出集群后,再次绘制一个新圆圈

我认为这个问题更适合programmers.stackexchange.com而不是这里:)

于 2012-11-24T16:28:05.893 回答