HEXの座標計算プログラム


2021年 8月 1日
 
 
 次の作品は何を作るか、まだはっきり決定はしてないけど候補としていくつか思考錯誤している。

 間単に作れそうなものとして、傑作ダイス戦略(DICE WARS)を改良したキャラクターダイス戦略なるものを構想している。


 
 
 そこで改めてマップ作成で 6角形 HEXの座標の扱い方を勉強するために「HEX 座標」でググッてみたのだけど、いくつか参考になるサイトの合間に自分の本ブログの記事もまざっていた。

 しかし、その記事は HEXの座標をどう扱うかの内容では無くて、単に HEXマップ描画の内容に過ぎず、ちょっと自分で情けなくなったので、改めて HEXの座標をどう扱うかの説明というかガイド(案内)に過ぎないのだけど、それを書き足しておきたいかなと思った。

 ただし自分で製作して思考錯誤したものでは無いので、あくまでもさわり程度の内容になる。

 お手本はこちら Hexagonal Grids

 このページをブラウザで日本語に翻訳して見るとよいだろう。

 はっきり言ってこのサイトの情報だけ押さえれば、大体分かると思う、というかネットではめずらしく専門的な内容で、その人は25年間 HEXの座標を扱っていたプロだそうな。
 
 

1、HEXの向き

 六角形 HEXには縦向きと横向きの 2つある.

 縦向き

 横向き

 まあ、自分も今まで向きがあるとは知らなかったんだけど、縦向きと横向きではプログラムが違ってしまうので、まずこの向きを決める事から始まると思う。

 ちなみに大戦略やダイス戦略は横向き、ヘクストラテジーは縦向き、印象では縦向きだと固い感じがするかな。
 
 
 
2、座標の取り扱い方法には 1次元、2次元、3次元がある

 座標のデータ構造の話だけど、結局ザックリ言って 1次元配列、2次元配列、3次元配列の方法があるみたい。
 
 
1次元の配列

 データ変数 map(n)で全マップ座標を扱う。

 自分の場合、HSPDishのプログラムで ANDROID実機で動かすと 2次元配列の書き込みができない(データ量が多いと?)仕様なので、しかたなくこの方法(1次元配列)を使ってるけど、普通はこの方法は使わず 2次元配列以上の方法を使うらしい。

 偶数列と奇数列があって、上下移動で変化する値が変わる。

 右は +1、左は -1で OK。

 偶数列と奇数列での修正値の変化を変数にしておく。

 ht1=0,-1,0, 1, 0, 0,0 ; 奇数列
 ht2=0, 0,0, 0,-1, 0,1 ; 偶数列

 データの並びは好みだが、この場合右上から時計回り、0個目は NULL(使わない)

 
 
 hxb=x座標の最大数、つまり横のHEXの数、ちなみに奇数列の右端は表示デザインの関係で表示されて無いが、計算がややこしくなるために座標としては存在して数えてる、つまり気数列偶数列共に同じ長さ。

 hnは現在の座標。

 右上、左上は
  f=(hn/hxb)¥2
  if f=1 : hn-=hxb+ht1(ky) ; 奇数列
  if f=0 : hn-=hxb+ht2(ky) ; 偶数列

 右下、左下は
  if f=1 : hn+=hxb+ht1(ky) ; 奇数列
  if f=0 : hn+=hxb+ht2(ky) ; 偶数列

 ¥は割った余りを表すので、2で割った余り、つまり偶数列では余り 0、奇数列では余り 1となる。

 kyは、この場合はキー入力値で右上から時計回りに 1、2、3、4、5、6。

 画像は偶数列なので右上から時計回りに -6、+1、+7、+6、-1、-7となってる。

 奇数列の場合 -6、+1、+8、+7、-1、-7となる。
 
 
 結局、1次元でも 2次元でも 3次元でもやり方はどうあれ、基本的には 6方向への値の変化を変数にしておけば良いだけの事だと思う。
 
 
 
2次元配列の場合

 データ変数 map(x,y)でマップ座標を扱う。

 ノーマルと 2倍数の 2種類方法があるようです。

 ノーマルの座標

 連続の、つまりこの場合横の、xの値が 1つずつ増えます。

 y座標、つまり上下に移動する時に、やはり奇数列と偶数列で変化が異なります。

 通常は x座標も y座標も上下左右で、それぞれ -1 +1すれば良いのですが、奇数列の右上右下移動の時にx座標に +1、偶数列の左上左下移動の時に x座標に -1します。

 y座標移動時に x座標が 1つずれる訳です。
 
 
 2倍座標

 連続の、この場合 xの座標が 2つずつ増減します。

 偶数列の x座標は 0、2、4、6・・・、奇数列の x座標は 1、3、5、7・・・と 2つずつ変化してますね。

 これにより、移動はそれぞれ x座標を2つずつとy座標を通常通り + -すれば良い事になります。

 ただ人によっては「表示座標の計算がしずらい、使われない変数座標があってバグの時に分かり難い?」とか言う人も居て、実際のプログラム上での使いまわしはどうなのか、自分はやってないので分かりません。
 
 
 
3次元配列の場合

 データ変数 map(x,y,z)でマップ座標を扱う。

 参考サイトの画像をそのままお借りしますね。

 それぞれ 3方向について x,y,zで増減する方法みたいです。

 自分には分からないので紹介のみです。
 
 
 変則でこれを 1つ軸を取って2次元で表す方法があるみたいです。

 見た所、これは 2次元配列の変則で、y座標を斜めにしただけで、オフセットの変則版のように見えます、まあ使った事が無いのでよくわかりませんけど。

 紹介のみです、後は参考サイトで勉強してください。
 
 
 サイトの日本語訳では 2次元のノーマルを「オフセット」、2倍のを「倍数」、3次元のを「キューブ、立方体」、3次元を 2次元で表すものを「アキューズ、アキシャル、軸座標」と呼んでるようです。

 参考サイトの記述によると

 「長方形のマップのみを使用し、マップを回転させない場合は、軸座標や立方体よりもマップと一致するため、2倍またはオフセット座標を検討してください」

 「他のすべての場合は、プライマリシステムとしてアキシャルを使用し、キューブの操作が簡単なアルゴリズムについてのみ3番目のキューブ座標を計算します」

 よく分かりませんが、簡単な操作の場合は 2次元で、複雑な事をしたければ 3次元で、という事でしょうか。

 ちなみに参考サイトでは 1次元は紹介されてません(笑)
 
 
 参考サイトでは「移動の計算の仕方」「HEXを直線に引く方法」「障害物(射線)の判定の仕方」「回転の仕方」等、詳しく書いてありますので、後はそちらで勉強してください。

 以上 HEXの座標計算について紹介程度に解説しました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です