CodePlex.comに16進グリッドユーティリティのライブラリを投稿しました。
https
ライブラリには、パス検索(A- * a la Eric Lippertを使用)と、ギザギザ(ユーザーと呼ばれる)座標とギザギザでない(カノニカルと呼ばれる)座標。path-findingnアルゴリズムにより、各ノードのステップコストは、入力された16進および移動した16進側の両方で変化します(ただし、提供されている例は単純です)。また、シャドウキャスティングを使用した高視野角が提供されます[編集:単語の削除]。
3つの16進グリッド座標系間で簡単に変換するコードサンプルを次に示します。
static readonly IntMatrix2D MatrixUserToCanon = new IntMatrix2D(2,1, 0,2, 0,0, 2);
IntVector2D VectorCanon {
get { return !isCanonNull ? vectorCanon : VectorUser * MatrixUserToCanon / 2; }
set { vectorCanon = value; isUserNull = isCustomNull = true; }
} IntVector2D vectorCanon;
bool isCanonNull;
static readonly IntMatrix2D MatrixCanonToUser = new IntMatrix2D(2,-1, 0,2, 0,1, 2);
IntVector2D VectorUser {
get { return !isUserNull ? vectorUser
: !isCanonNull ? VectorCanon * MatrixCanonToUser / 2
: VectorCustom * MatrixCustomToUser / 2; }
set { vectorUser = value; isCustomNull = isCanonNull = true; }
} IntVector2D vectorUser;
bool isUserNull;
static IntMatrix2D MatrixCustomToUser = new IntMatrix2D(2,0, 0,-2, 0,(2*Height)-1, 2);
static IntMatrix2D MatrixUserToCustom = new IntMatrix2D(2,0, 0,-2, 0,(2*Height)-1, 2);
IntVector2D VectorCustom {
get { return !isCustomNull ? vectorCustom : VectorUser * MatrixUserToCustom / 2; }
set { vectorCustom = value; isCanonNull = isUserNull = true; }
} IntVector2D vectorCustom;
bool isCustomNull;
IntMatrix2DおよびIntVector2Dは、affine2D Graphics VectorおよびMatrixの[編集:同種]整数実装です。ベクトルアプリケーションでの2による最後の除算は、ベクトルを再正規化することです。これはIntMatrix2D実装に埋もれる可能性がありますが、IntMatrix2Dコンストラクターの7番目の引数の理由はそれほど明確ではありません。非現在の製剤のキャッシュと遅延評価の組み合わせに注意してください。
これらのマトリックスは次の場合です。
- 六角穀物垂直;
- CanonicalおよびUser座標の場合は左上の原点、カスタム座標の場合は左下の原点。
- Y軸が垂直に下向き。
- 水平方向の長方形のX軸。そして
- 北東への標準的なX軸(つまり、Y軸から120度CCWで上および右)。
上記のコードライブラリは、16進選択(マウスクリックで選択された16進を識別する)のための同様にエレガントなメカニズムを提供します。
Canonical座標では、6つの基本方向ベクトルは(1,0)、(0,1)、(1,1)およびすべての六角形の逆数であり、ギザギザの座標の非対称性はありません。