2

六角形のマップがありますが、座標系が一部の findpath アルゴリズムの使用に適していないことに気付いたので、再構築したいと考えています。私は私を完全に満足させる1つのシステムを選びました. ここで見つけることができます。しかし、参照されている例では、マップ全体が必要以上に回転しています。

私の古いバージョンの地図はこちら: http://dark-project.cz/wesnoth/map-view/1

私の質問は、マップを HTML でレンダリングして、現在と同じマップを新しい座標系で表示する方法です。

(私はPHPサイクルを使用してレンダリングします。フィールドごとに、座標、フィールドタイプ(草、村、...)、フィールド画像の寸法などの情報があります)

回答ありがとうございます。

PS: HTML5 Canvas を使用して実行できると思いますが、優れたブラウザー サポートが必要であり、HTML5 の経験がありません (ただし、高速でブラウザー サポートが優れていれば、クライアント側でレンダリングするつもりはありません)。だから私はサーバー側(PHP)のソリューションが好きです!

4

1 に答える 1

2

お使いの座標系は、アルゴリズムのデモで使用されているものと互換性がありません。

最善の策は、座標系を使用するために見つけたアルゴリズムを変更することだと思います。

AFAIKあなたは本質的に変更する必要があります:

  • 与えられた座標を取り、6つの隣接する座標を決定する部分。
  • 特定の座標がマップの境界内にあるかどうかを判断する関数。
  • (一種の)コスト/距離を計算する関数

デモコードが次のようになっていることに気付きました。

function hex_distance(x1,y1,x2,y2) {
    dx = Math.abs(x1-x2);
    dy = Math.abs(y2-y1);
    return Math.sqrt((dx*dx) + (dy*dy));
}

しかし、軸が垂直ではないため、これは不正確な見積もりです。最適でない結果が生成される可能性があります。A*検索でのスコア関数の要件は、実際のコストを超えない値を生成することです。この関数はその規則に違反する可能性があります。

座標系は実際にはその関数をより正確にしますが、マンハッタン距離だけで逃げることもできます。

function hex_distance(x1,y1,x2,y2) {
    return abs(x2-x1) + abs(y2-y1);
}

これは、私が間違っていなければ、(x1、y1)から(x2、y2)に到達するために必要なタイルステップの数になります。

于 2012-04-09T15:25:19.840 に答える