1

この質問を新しい質問の基礎として使用するという明らかな伝統に従って、私も可能な限りエレガントに解決しようとしている問題を抱えています。

私はそのように六角形の地図を実装しました:

(ここに画像を挿入したいのですが、新品のため許可されていません...上記のリンクをご覧ください)

しかし、今、これらのタイプの座標を使用して、このタイプのマップにA *を(エレガントに)実装する方法を考えています。私は典型的な正方形のグリッド(デカルトグリッドだと思いますか?)でA *を使用した経験があり、そこでの処理方法はこの座標系と互換性がないようです。

通常、バイトの2D配列を生成します。配列のインデックスはグリッド座標に対応し、そのインデックスの値はそのノードの「重み」を示します。(0は通行不能であり、数値が大きいほど、数値が小さいよりも重くなります)。

例: sbyte[,] pathGrid = new sbyte[5, 5] { {0,0,1,0,0}, {9,5,1,3,0}, {9,5,1,3,0}, {9,5,1,3,0}, {0,0,1,0,0} };

0が通行不能である場合、1は簡単にトラバースでき、数値が大きいほどトラバースに「コスト」がかかります。(フォーマットについて申し訳ありません。私はスタックオーバーフローですnewb:P)この配列は、マップの構成に基づいて生成され、パスファインディングアルゴリズムに入力されます。パスファインディングアルゴリズムは、ノードのリスト(パス)を吐き出します。または、パスが見つからなかった場合はnullを返します。

ただし、このタイプのグリッドを使用すると、負の座標(明らかに配列では機能しない)とグリッドが'と同じルールに従わないため、(少なくとも一見すると)不可能です。典型的な'グリッド。

私のA*メソッドを使用してこれを解決する方法はいくつかあると思いますが、それらはすべてかなりずさんで(グリッド座標の変換と空のノードの使用)、誰かがこれをエレガントに行う方法を考えているのではないかと思いました。

とにかく読んでくれてありがとう:)(ところで私はそれが価値があるもののためにC#/。netでこれをやっています)

4

2 に答える 2

2

配列のインデックスは0から始まりますが、プログラムは概念的に配列をそのように扱う必要はありません。たとえば、配列を検索するためにインデックスを使用する前に、常にインデックスに3などを追加すると、インデックスが3から始まる配列が効果的に作成されます。この方法で配列の操作を簡素化するために、クラスを作成できます。たとえばArbitraryBaseArray、目的のベースインデックスを指定する配列と数値をラップします。

HexGrid次に、それぞれが独自のベースインデックスを持つの配列を含むクラスを作成できますArbitraryBaseArray(16進領域の左端がどのように見えるかに応じて)。クラスには、2つの16進座標に基づいて特定の要素を検索できるインデクサーを含めることができます。また、16進グリッドの座標が与えられると、6つの隣接する座標を持つ配列を返す静的メソッドを持つこともできます。このメソッドはA*で使用できます。(リンク先の質問の図では、各六角形タイルに3つの座標が使用されていますが、2つの座標で十分であることに注意してください。)

于 2011-05-08T23:35:44.000 に答える
0

座標を辞書に保存できます。

var nodes = new Dictionary<Point, Vector[]>;

このように、正の座標に制限されず、各ノードからのパスの数にも制限されません。

于 2011-05-08T23:42:22.307 に答える