我正在研究一些人工智能,我希望我的人工智能不会碰到给定的坐标,因为这些是墙/边界的参考。
首先,每次我的人工智能撞到墙时,它都会引用这个位置(x,y)。当它三次撞到同一面墙时,它使用线性检查点来“想象”有一堵墙穿过这些坐标。
我现在想阻止我的人工智能再次进入那堵墙。
为了检测我的坐标是否成直线,我使用:
private boolean collinear(double x1, double y1, double x2, double y2, double x3, double y3) {
return (y1 - y2) * (x1 - x3) == (y1 - y3) * (x1 - x2);
}
这是返回真是给定的点是线性的,彼此。
所以我的问题是:
我觉得这需要一些令人费解的三角学吗?
发布于 2012-11-24 15:56:02
对于#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-24 16:28:05
有趣的问题。好吧,我想到了两个孩子:
m
和line c
存储为每一行y= mx +c
。所以一旦你把你的协调变成了一个新的协调。把你的新(x1,y1)
放在上面的方程中,看看是否是y1 == m*x1 + c
。作为O(n)
,整个操作在计算上是昂贵的,其中n
是为每一个新的协调运动检测到的行数。您可以根据集群而不是每一行进行聚类点和行匹配检查,从而减少上述问题。例如,存储所有行通过群集的内容,并仅在当前位于相应集群中时检查这些行。这应该是一个理想的解决方案。
r
的假想圆。获得圆后,查找所有行通过当前集群的内容(如上文所述)。对于每一个新的运动,检查墙壁或不只是这些线。一旦你离开你的集群,再次画一个新的圆圈。我认为这个问题更适合于programmers.stackexchange.com,而不是这里:)
https://stackoverflow.com/questions/13542592
复制相似问题