半径が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);