Java 使用线性坐标检查AI

Java 使用线性坐标检查AI,java,trigonometry,coordinate-systems,game-ai,Java,Trigonometry,Coordinate Systems,Game Ai,我正在研究一些人工智能,我希望我的人工智能不会遇到给定的坐标,因为这些坐标是墙/边界的参考 首先,每次我的AI碰到墙时,它都会引用该位置(x,y)。当它三次撞击同一堵墙时,它使用线性检查点“想象”有一堵墙穿过这些坐标 我现在想阻止我的AI再次进入那堵墙 要检测我的坐标是否为直线,我使用: private boolean collinear(double x1, double y1, double x2, double y2, double x3, double y3) { return

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

首先,每次我的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

所以我的问题是:

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

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

  • 我觉得这需要一些令人困惑的三角法?

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

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

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

    • 因此,您可以做的是,一旦检测到每条线,就按照线
      y=mx+c
      存储其斜率
      m
      和线常数
      c
      。所以,一旦你改变你的坐标到一个新的坐标。将新的
      (x1,y1)
      放入行上等式,查看
      y1==m*x1+c
      。由于
      O(n)
      其中
      n
      是为每个新坐标运动检测到的线数,因此整个操作的计算成本较高
    您可以通过对点进行聚类并按簇检查线匹配(而不是针对每一条线)来减少上述问题。i、 e.存储通过集群的所有线路,并在当前处于相应集群时仅检查这些线路。这应该是一个理想的解决方案

    • 另一个解决方案是在当前点周围有一个半径为
      r
      的假想圆。获得圆后,查找所有线通过当前簇的位置(如上所述)。对于每一个新的移动,检查墙或不只是这些线。一旦你移出你的群,再画一个新的圆

    我认为这个问题更适合程序员。stackexchange.com而不是这里:)

    你说的“对照检查”是什么意思?根据墙的位置,对照我的AI的位置。所以,如果人工智能正在接近墙壁(线性坐标),我想停止移动,然后转过身(但现在,一个简单的打印就可以了),所以你不是指你的人工智能的位置,而是指你的人工智能的速度,你想知道你的人工智能是否会在其当前轨迹上撞到墙壁。哦,是的,这正是我要寻找的。我只使用位置。如果AI位置接近墙壁位置-发出警告。好的,谢谢,我如何找到“m”和“c”?我知道m的变化是y/x的变化,但我如何找到变化呢?对不起,我的数学不好。谢谢你,我得到了(y1-y3)/(x1-x3)。现在它只是“c”。好的,这就是得到直线方程的方法。假设你有2个点(x1,y1)(x2,y2)。do(y-y1)=((y2-y1)/(x2-x1))*(x-x1)。当你解决这个问题时,试着得到y=mx+c的形式。由此,获得相应的m和c。