私の状況を理解するために少し時間を取ってください。わからない場合はコメントで教えてください。
ウェイポイントのArrayListがあります。これらのウェイポイントは順不同です。ウェイポイントには次のプロパティがあります。
{int type, float z, float y, float x, float rotation}
これは3次元の世界に適用されますが、私のパスファインディングは高さを気にする必要がないため(したがって、世界を2次元の世界として扱う)、y値は無視されます。この質問では、回転は重要ではありません。
- この2次元の世界では、xはx軸を表し、zはy軸を表します。
- xが増加すると、世界のオブジェクトは東に移動します。xが減少すると、世界のオブジェクトは西に移動します。
- zが大きくなると、世界のオブジェクトは北に移動します。zが減少すると、世界のオブジェクトは南に移動します。
したがって、これらの「新しい」ウェイポイントは次のように簡略化できますwaypoint = {float x, float y}
。
現在、これらのウェイポイントは、オブジェクトのX軸(x)とY軸(z)の位置を表しています。さらに、現在の場所:curLocation = {float x, float y}
とターゲットの場所:がありtarLocation = {float x, float y}
ます。
これが私が取得したいものです:次の厳しい条件下でからに
つながるウェイポイント(別名:パスまたはルート)のすべての組み合わせ:curLocation
tarLocation
- 各ウェイポイント間の距離は、より大きくすることはできません
(float) maxInbetweenDistance
。これには、curLocation
最初のウェイポイントからの最初の距離と、最後のウェイポイントからのまでの距離が含まれtarLocation
ます。そのようなウェイポイントの組み合わせが不可能な場合は、nullを返す必要があります。 - ターゲットウェイポイントにつながるウェイポイントから複数のウェイポイントが見つかった場合
maxInbetweenDistance
は、最も近いウェイポイントを選択する必要があります(少し離れた別のウェイポイントが、より長い距離の新しいパスになり、これも返される場合はさらに良いでしょう) )。 - 返されるウェイポイントの組み合わせ(パス)の順序は、最短ルート(最小距離)から最長ルート(最大距離)の順にする必要があります
最後に、次の点を考慮してください。
- これは私がAI/パスファインディングを賢く行う必要がある唯一のことです。それが私が本格的なパスファインディングまたはAIフレームワークを使用したくない理由です。1つの関数で上記を処理できるはずだと思います。
- ウェイポイントの可能なすべての組み合わせを返すとオーバーヘッドが大きくなりすぎる場合は、組み合わせの最大数を指定できれば問題ありません(ただし、最も近いものから最も遠いものの順に並べます)。例えば。最も近い5つのパス。
どうすればこれを達成できますか?フィードバックをいただければ幸いです。