5

追加情報:

正方形の内側をアリーナとして使っています。起動時に、正方形がランダムな位置と回転でスポーンし、正方形の属性にアクセスできません。

次に、AIを構築している正方形の中に移動するオブジェクトがあり、アリーナの壁がどこにあるかをオブジェクトに「学習」させたいと思います。オブジェクトが壁にぶつかるたびにタッチリターンが返されるので、オブジェクトがヒットしたかどうかがわかります。これを使用して、オブジェクトが壁に当たった場所のグローバル位置をマッピングして保存します...同じ壁に3回当たった後、アリーナの壁を表すドットの下に数学的に「直線を描きます」 -これで、これらの座標に近づかないようにオブジェクトに指示できます。

3ドットの理由は?オブジェクトが壁の片側に当たった後、壁の別の側に当たった場合、一方の側からもう一方の側に線が引かれ、壁がどこにあるかについて誤ったデータが得られます。

Javaが3つ(またはそれ以上)のドットをインラインで検出した場合、オブジェクトが同じ壁にぶつかったことを認識しています(さらに上かそこら)。

続き:

与えられた座標データで線をマッピングしようとしています。基本的に、私はX座標とY座標を保持する配列を持っており、それらが直線を構成しているかどうかを数学的に検出できるようにしたいと考えています(数ピクセルを与えるか取るか)。(座標は正​​方形の境界線です)

たとえば、配列は次のようになります。

[x0] [y0]-1,1

[x1] [y1]-2,2

[x2] [y2]-5,5

これは、次のように、正方形の側面に対角線を表示します。

ここに画像の説明を入力してください

しかし、正方形の片側の1つの座標を取得し、次に別の側の座標を取得する場合があります。これらはすべて混同されます(90度の角度である必要はありません)。したがって、配列を実行して、どの座標が線(または正方形の境界側)を構成するかを検出できるようにしたいのです。

ここに画像の説明を入力してください

だから今、私は2D配列を持っています:

private double wallLocations[][] = new double[10][10];

そして、その仕事をしないwhileループ。私はこれからどこから始めればよいのか本当にわかりません:

for(int r = 0; r < wallIndex; r++){
            for(int c = 0; c < wallIndex; c++){

                int index = 0;
                if(wallLocations[r][index] == wallLocations[r][c] && wallLocations[r][index + 1] == wallLocations[r][c] &&
                        wallLocations[r][index + 2] == wallLocations[r][c]){

                    System.out.println("***** Wall Here! *****");
                    index++;
                }

            }
        }

- - アップデート - -

これが私が探しているもののより良い例です。赤い点は入ってくる座標を表し、3つ以上の点が並んでいるときに線が検出されます(2つの点の場合は、すべての点が検出されます)...これがボーダーのように見え始めていることに気付きます正方形の?

ここに画像の説明を入力してください

4

2 に答える 2

2

これは本質的にクラスタリングの問題のようであり、一般的にはかなり難しい場合があります。クラスタリングが難しい理由の1つは、適用可能なマッピングが複数存在する可能性があることです。

たとえば(私の悪いアスキーアートを許してください):

 X   X   X  

   X   X   X

 X   X   X   X   

マッピングできます

 X---X---X          X   X   X 
                     \ / \ / \ 
   X---X---X   or     X   X   X
                     / \ / \   \
 X---X---X---X      X   X   X   X 

この種のものに使用される混合ガウスモデルを使用した期待値最大化アルゴリズムの使用を見てきましたが(ポイントが多く、期待される線が少ない場合)、通常、そのアルゴリズムに一定数のクラスターを与える必要があります。その結果は良好ですが、かなり遅いアルゴリズムであり、おそらく多くの反復が必要です。ある種の画像処理アルゴリズムである、一般的に高速なものを見たと思いますが、調査を行う必要があります。

ポイントのすべてのペアに対してy=mx + bが見つかり、それらをmとbで並べ替えるようなものがあるのではないかと思います。代わりに、各ペアの[0、pi)で角度θを見つけて、mの代わりに角度を並べ替えるのが有利な場合があります。またはcos(2θ)、線のグループ{y = -0.0001 x + 1、y = 1、およびy = 0.0001x + 1}は非常に似ており、線のグループ{y = -10000x + 10、x = 0、およびy = 10000x -10}も非常に似ていますが、cos (2θ)は、各グループ間の任意の2つのペアがほぼ垂直である必要があるため、それらを可能な限り離して配置する必要があります。

また、私の例では、x軸にほぼ垂直な線ではbはあまり重要ではないため、「b」は直接クラスタリングにはあまり役立たない可能性があることに注意してください。

おそらく、2つの線の間の「距離」の利用可能な尺度があるかもしれませんが、それがどうなるかはわかりません。「画面上」(ポイントが一般的にある場所)に収束するほぼ平行な2つの線は、画面から1兆単位離れた場所に収束する場合よりも、「近い」と見なす必要があります。純粋に言えば、3本の線が平行でない場合(平面上にある場合はすべてどこかで交わる)、ペアごとに互いに近いと見なすことはできませんが、直感的には、通常1インチの2本の線がある場合私たちが関心のある領域で離れて、私たちはそのペアを、関心のある領域で1マイル離れている2つの同じように尖った線よりも近いものとして選びます。それは私に多分線の間の領域を考えさせます、私たちの領域*によって制限されるように、メトリックとして使用する必要があります。

申し訳ありませんが、ブレーンストーミングがどれほど役立つかはわかりませんが、状況に別の光を当てる可能性があります。

編集:あなたは何を知っていますか、これを研究することによっておそらくより良い答えが見つかるかもしれません:

http://en.wikipedia.org/wiki/Hough_transform

IIとIIIを編集:

わかりました...今説明した状況ははるかに単純で一般的ではありません(ただし、正直なところ、最初のクエリを実際よりも一般的であると誤解したと思います)。

4つの候補壁があります。AIが3つの同一直線上の点を見つけるまで、AIを跳ね返らせます。これは、組み合わせの簡単なテストになるはずです。これらの3つのポイントに壁を割り当てます。あなたが持っている他のポイントに応じて、あなたは実際に他の3つの壁を決定するか、少なくとも推定することができるかもしれません(それがそうであると仮定し四角)。別々の壁に3つのポイントがある5つのポイントがある場合、壁間の距離、つまり4番目の壁の位置を計算できるはずです。他の2つのポイントが別々の壁にあるかどうかをテストするには、壁によって定義された線に垂直または平行な線とペアワイズで同一直線上にないことを確認します。または、それらが平行な線上にある場合は、テストして確認します。それらの間の距離が壁とそれらの間の距離よりも小さい場合(その場合、それらは最初の候補壁の反対側の壁にあります)。それらが別々の壁にあるとすると、最初に見つかった壁に面しているか、その壁に垂直な壁にあります。どちらの方法でも、少しトリッキーなジオメトリで壁を定義する線を見つけることができます。

(実際には、寸法を決定するために、3つの同一直線上の点があることを確認するためにテストする必要はないと思います...2回転したことを確認するためにテストする必要があると思います。 。これは最低4ポイントかかりますが、運が悪ければもっと多くなる可能性があります。2つのポイントは、他の2つのポイントとは異なる壁にあると判断できる必要があります。つまり、非常に大きな跳ね返りです!)

少し数学が関係していて、今夜は少し疲れすぎて説明できません。正方形の周りの点のジオメトリをどれだけ利用したいかわかりません。より一般的なケースでこれらのプロパティを使用するため、そのままにしておきます。また、後で他の以前のブレインストームの一部を削除することもできます。

于 2012-11-24T02:28:10.340 に答える
0

2つのポイントがある場合は、Math.atan2を使用して接続線の勾配を計算できます。

于 2012-11-24T00:07:00.737 に答える