[程式] 改良的六角座標系統
※ [本文轉錄自 GameDesign 看板]
作者: ragingbull (ragingbull) 看板: GameDesign
標題: [程式] 改良的六角座標系統
時間: Mon Aug 3 23:51:48 2009
今天稍微研究了一些六角座標系統(Hexagonal Coordinate System)的文獻,配合一些想
像,嘗試一個改良的方法。
首先,我想讓六角座標系和我們熟悉的直角坐標系有更緊密的聯想。
參考上圖,左邊的圖是直角座標系,這種座標已經深入人心,成為一種”直覺”。例如,
當我們看到一個座標(x, y),就能直覺聯想出它和原點的相對位置。
有沒有可能用Tile(方格)來表現Hexagon(六角格),而且維持相近的座標感呢?
右邊的圖提供一種想法,我故意使用非正方形的Tile,並且把單數行拉高(或低)半格,仔
細比照中間和右邊的圖,是不是滿相似?
最妙的是,比照左右兩圖不難發現,即使是稍微錯開的Tile,仍然維持和直角座標相近的
地理感。
如此一來,無論繪製成六角形,或是錯開的矩形,背後都是六角座標系統,並且維持著直
角座標系的地理感。
底下是在Hexagon裡,點(Vertex, V)、線(Edge, E)、面(Face, F)之間的九種關係。
實際的算法依座標系統而異,在此我採用上面提到的改良式座標系統。
我假設要探討的中心面座標是(x, y),N/E/W代表它北東西三方向的鄰邊,L/R代表它左右
兩個鄰點。
九種點線面關係
定義
Neighbors (F-F)
(x,y+1) (x+1,y) (x+1,y-1) (x,y-1) (x-1,y-1) (x-1,y)
Borders (F-E)
(x,y,N) (x,y,E) (x,y,W) (x+1,y-1,W) (x,y-1,N) (x-1,y-1,E)
Corners (F-V)
(x+1,y,L) (x,y,R) (x+1,y-1,L) (x-1,y-1,R) (x,y,L) (x-1,y,R)
Joints (E-F)
(x,y,N) → (x,y+1) (x,y)
(x,y,E) → (x+1,y) (x,y)
(x,y,W) → (x,y) (x-1,y)
Continues (E-E)
無 (任意2邊無法連成直線)
Endpoints (E-V)
(x,y,N) → (x+1,y,L) (x-1,y,R)
(x,y,E) → (x,y,R) (x+1,y,L)
(x,y,W) → (x-1,y,R) (x,y,L)
Touches (V-F)
(x,y,L) → (x,y) (x-1,y) (x-1,y-1)
(x,y,R) → (x+1,y) (x+1,y-1) (x,y)
Protrudes (V-E)
(x,y,L) → (x,y,W) (x-1,y-1,E) (x-1,y-1,N)
(x,y,R) → (x+1,y-1,N) (x+1,y-1,W) (x,y,E)
Adjacent (V-V)
(x,y,L) → (x-1,y,R) (x-1,y-1,R) (x-2,y,R)
(x,y,R) → (x+2,y,L) (x+1,y-1,L) (x+1,y,L)
實作出這樣的一個座標系並不難,值得注意的問題有三個:點線面的資料結構、九種關係
的演算法、繪圖的座標轉換。
一些實用的運算函式還包括distance, life-of-sight(raycasting),
field-of-view(shadowcasting)等。
更進階的應用則有pathfinding, areafinding等。
參考文章:
* Amit’s Thoughts on Grids
* Hex Grids
* Computing Field of View on a Hexagonal Grid
文章附圖出處: http://taoname.blogspot.com/2009/08/blog-post_4397.html
請大家多多指教 :D
--
http://taoname.blogspot.com/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.165.7.158
※ 編輯: ragingbull 來自: 118.165.7.158 (08/03 23:58)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.165.7.158
推
08/04 01:56, , 1F
08/04 01:56, 1F
※ 編輯: ragingbull 來自: 118.165.28.133 (08/04 21:55)
討論串 (同標題文章)
完整討論串 (本文為第 1 之 4 篇):
程式
1
1