【算法記錄/六邊形網格】(一)座標系統

說在前面

  • 原文地址:Hexagonal Grids強烈建議原文體驗一下
  • 其他:不說了,我就是個渣渣

引言

  • 現在讓我們將一個個的六邊形組成網格。對於方形來說,我們只有一種方式。
    在這裏插入圖片描述

但是對於正六邊形來說,我們有很多種方式。就個人而言,我習慣於使用立方體(三維)座標(Cube coordinates)來處理算法問題、使用縱向座標(Axial coordinates)/倍化座標(Doubled coordinates)來存儲。

偏移座標(Offset coordinates)

  • 最常見的方法是將每一行(或列)進行偏移。每一列被命名爲col(q),每一行被稱爲row(r)。我們可以選擇偏移奇數行或者偶數行,也可以選擇偏移奇數列或者偶數列。

  • 偏移奇數行(這裏的偏移是相對而言的,奇數行相對於偶數行向右偏移)
    在這裏插入圖片描述

  • 偏移偶數行(這裏的偏移是相對而言的,偶數行相對於奇數行向右偏移)
    在這裏插入圖片描述

  • 偏移奇數列
    在這裏插入圖片描述

  • 偏移偶數列
    在這裏插入圖片描述

立方體座標(Cube coordinates)

  • 另一種標定正六邊形網格的方法是使用三個基本座標軸,這種方法有着很強的對稱性。

  • 考慮如下立方體,選擇一個斜切面(滿足x+y+z=0)。雖然這種方式看起來十分怪異,但是卻能夠讓我們的正六邊形網格算法更加簡單。並且在這樣的座標系下,我們能夠重複使用一些標準的操作:加、減、乘、除、縮放、距離等
    在這裏插入圖片描述
    在這裏插入圖片描述

  • 這個斜切面上的所有立方體就是我們的正六邊形網格,由於是個平面,所以這個斜切面上的所有立方體的座標都滿足x+y+z=n(取n=0)
    在這裏插入圖片描述

  • 雖然有時候沒有適合正六邊形網格的算法,但是在立方體網格中卻存在。立方體座標可以讓我們將立方體網格中的算法轉移到正六邊形網格中。通常,我們可以先將座標轉換到另一種座標系中,在執行算法之後再將結果轉換到原座標系中。

  • 現在讓我們來看看立方體座標系是怎樣在正六邊形網格中運作的。如下圖,當我們往着+z移動時,除了z座標改變之外,y座標也在改變。(在原文中嘗試一下)同時我們可以發現,在我們往任意相鄰格子移動時,一定會有兩個座標發生改變
    在這裏插入圖片描述

  • 立方體座標是正六邊形網格的一個合理選擇,並且所有的算法也必須滿足約束條件x+y+z=0

縱向座標(Axial coordinates)

  • 雖然立方體(三維)座標方便了算法,但是卻不適合存儲。

  • 縱向座標去掉了立方體(三維)座標中的一維,因爲約束條件是x+y+z=0,存在一維冗餘(只要知道其中兩個,就可以計算出剩下的一個),因此我們可以只保留兩個維度來存儲數據。
    在這裏插入圖片描述

  • 相對於偏移座標來說,縱向座標可以方便的進行運算(加減乘除),但是在存儲一個矩形地圖的時候就顯得有些奇怪。

倍化座標(Doubled coordinates)

  • 雖然我推薦使用縱向座標(Axial coordinates),但是如果你依然堅持使用偏移座標(Offset coordinates)的話,可以考慮下倍化座標(Doubled coordinates),這個座標也可以簡化一些運算。
  • 在倍化座標下,行距(或者列距)是原來的兩倍,這樣就可以產生一個約束:(col+row)%2=0
  • 倍化x座標
    在這裏插入圖片描述
  • 倍化y座標
    在這裏插入圖片描述
  • 倍化座標這個名字並不正式,其實還存在許多別稱,例如在tri-bit.com裏被稱爲interlaced