六角形のグリッドでタイルのリングを取得


17

この投稿のおかげで:六角形のタイルとそれらの隣接する隣人を見つける、私は与えられたタイルに隣接するタイルを収集することができます。しかし、オフセットで指定されたタイルの「リング」のみを提供するアルゴリズムにかなりこだわっています。そのStack Overflowポストで与えられたアルゴリズムは、タイルを収集する順序を正確に気にしません。

オフセットごとに6タイルが追加されることを知っています。

  • オフセット1は、6つのタイル(最初の隣接タイル)を提供します。
  • オフセット2は12です。
  • オフセット3は18などです。

オフセットごとに6の一定の成長があります。したがって、これらのオフセットに適応するルールがあるはずだと思います。これを正確に把握することはできません。誰でも?

回答:


23

半径がNの六角形のリングは、それぞれ長さがNの6本の直線で構成されています-以下の非常に粗雑な例を参照してください:) N = 2の場合:

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

矢印はそれぞれ2ヘクスをカバーします。

north()、seasteast()など、特定の方向に隣接するタイルを提供する関数があると仮定します。そのため、擬似コードのアルゴリズムは次のようになります。

var point = startingPoint.north(N)
for i = 0..N-1:
    result.add(point)
    point = point.southeast(1);
for i = 0..N-1:
    result.add(point)
    point = point.south(1);
for i = 0..N-1:
    result.add(point)
    point = point.southwest(1);
for i = 0..N-1:
    result.add(point)
    point = point.northwest(1);
for i = 0..N-1:
    result.add(point)
    point = point.north(1);
for i = 0..N-1:
    result.add(point)
    point = point.northeast(1);

これは、エッジケースN = 1で6タイルを返し、N = 0で空のセットを返す場合にも機能することに注意してください。

私はコードが完璧ではないことを知っています:)ここにはいくつかの冗長性があります。定期的にタイル化されたマップ(六角形またはそれ以外)を使用する私のプロジェクトでは、通常、列挙 "Direction"があります。これにより、これをよりスムーズに行うことができます。

var point = startingPoint.inDir(N, Direction.North)
var dir = Direction.SouthEast.
for d = 0..Direction.count():
    for i = 0..N-1:
        result.add(point)
        point = point.inDir(1, dir);
    dir = nextDirection(dir);

これは正しい方向に私をプッシュする必要があります。ありがとう!
シダー

2
コードサンプルでは、​​最初の5つのセグメントに重複するポイントが追加されることに注意してください。しかし、それはいい答えです。
マイケルハウス

@ Byte56そうだね。しかし、少なくとも私は方向のシフト間の関係を見ています!
シダー

1
@ Byte56本当に?ふむ 私はそれを避けようとしました... 0..N-1はN = 2に対して0..1を与えるので、それはi = 0とi = 1であり、2つの値です。各回6方向からの2つの値は、12タイルです。
リオサン

いや。あなたが正しい。各ループが最後のループからポイントを追加しているので、私はループのために1つずつ離れていました、私の間違い。それは賢いアルゴリズムです。
マイケルハウス

2

この記事は六角形のグリッドアルゴリズムの非常に優れたリファレンスであることがわかりました。また、「距離」のセクションでは、2つのタイル間のステップ数を決定する方法を示します。軸座標(xy)を立方体座標(xyz)に変換する場合、距離は常に2つのタイル間の最大座標オフセット、またはmax(| dx |、| dy |、| dz |)に等しくなります。

目的の距離にあるタイルのグリッド全体の徹底的な検索は次のとおりです。 On2 グリッドディメンションを使用しますが、小さなグリッドに適したシンプルな実装です。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.