【问题标题】:Using Linear Coordinates to Check Against AI使用线性坐标检查 AI
【发布时间】:2012-11-24 15:25:13
【问题描述】:

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

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

我现在想阻止我的 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 的一条线。但是要“想象”一条线一直穿过这些线性坐标,直到无穷大(或接近)。

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

【问题讨论】:

  • “检查”是什么意思?
  • 就墙的位置而言,与我的AI的位置相对。所以如果 AI 正在接近墙壁(线性坐标),我想停止移动,然后转身(但现在,一个简单的 PRINT 就可以了)
  • 所以你不是指你的 AI 的位置,你是指你的 AI 的速度,你想知道你的 AI 是否会在它当前的轨迹上撞墙。
  • 哦,是的,这对我正在寻找的东西很重要。我只使用职位。如果 AI 位置接近 Wall 位置 - 发出警告。

标签: java trigonometry coordinate-systems game-ai


【解决方案1】:

对于#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);
}

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

【讨论】:

    【解决方案2】:

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

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

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

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

    我觉得这个问题比这里更适合programmers.stackexchange.com :)

    【讨论】:

    • 好的,谢谢,如何找到“m”和“c”?我知道它在 y 中的变化/在 x 中的变化,但是我如何也找到变化呢?对不起,我的数学很弱。谢谢
    • 好吧,我明白了——实际上只是做了 (y1 - y3) / (x1 - x3)。现在它只是'c'。
    • 好的,这就是你得到直线方程的方法。假设您有 2 个点 (x1,y1) (x2,y2)。做 (y-y1) = ((y2-y1)/(x2-x1))*(x-x1) 。当你解决这个问题时,试着得到 y = mx +c 的形式。这样,获得各自的 m 和 c。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多