1

私はいくつかの人工知能に取り組んでいます。これらは壁/境界の参照であるため、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 までの線があります。しかし、無限 (または閉じる) まで、これらの線形座標を通る線を「想像」します。

これにはややこしい三角法が必要になると思いますか?

4

2 に答える 2

0

興味深い問題です。さて、2つのアプローチが頭に浮かびます:

  • したがって、できることは、すべての線が検出されたら、その勾配mと線定数cを line ごとに保存することy= mx +cです。したがって、座標を新しい座標に変更したら。(x1,y1)上の行の方程式に新しいものを入れて、かどうかを確認しy1 == m*x1 + cます。新しい座標の動きごとに検出される線の数はO(n)どこにnあるので、操作全体の計算コストが高くなります。

ポイントをクラスタリングし、ラインごとではなくクラスタごとにラインの一致をチェックすることで、上記を減らすことができます。つまり、すべてのラインがクラスターを通過するものを保存し、現在それぞれのクラスターにいるときにそれらのラインのみをチェックします。これは理想的な解決策になるはずです

  • r別の解決策は、現在のポイントの周りに半径の架空の円を作成することです。円が得られたら、すべての線が現在のクラスターを通過するものを見つけます (上記で説明したように)。すべての新しい動きについて、それらの線だけでなく、壁をチェックしてください。クラスターから移動したら、新しい円をもう一度描きます

この問題は、ここよりもprogrammers.stackexchange.comに適していると思います:)

于 2012-11-24T16:28:05.893 に答える
0

#2 では、必要な壁/線上の任意の点と 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);
}

したがって、計算された勾配は点を共有するため、それらが同じであれば、それらはすべて同じ線上にあります。

于 2012-11-24T15:56:02.497 に答える