2010-12-12 68 views
1

的我有建立一個十六進制地圖代碼:問題創造六角地圖

int diamater = 32;  
int grid_x_size = 19; 
int grid_y_size = 5; 
for (int x=0; x<grid_x_size; x++) { 
    for (int y=0; y<grid_y_size; y++) { 
     int x_position = diamater*x+(y%2)*diamater/2; 
     int y_position = diamater*y; 
     add(new ImageSprite(image, x_position, y_position, diamater, diamater)); 
    } 
} 

它看起來這裏這麼: Screnshot

爲什麼行之間是有距離的?球不是密集的?

謝謝!

回答

2

您正在試圖生產hexagonal packing,而不是方形包裝。

alt text

的圓的中心之間的垂直距離應小於直徑,因爲在第二行的頂部填充第一行的底部之間的孔中,使所述第一的兩個邊界框行輕微重疊。請注意,在第一張圖片中,只有五排圓圈,但第二排中有六排,儘管第二個包裝不佔用更多的垂直空間。

行之間的實際高度差是height of an equilateral triangle,其邊等於圓的直徑,例如可以使用Pythagorean Theorem進行計算。

嘗試y_position = sqrt(3)/2 * diameter * y

+0

非常感謝!非常有用的答案。 – matvey 2010-12-12 00:49:45

0

三個相鄰圓的中心形成一個等邊三角形,邊長爲直徑(在本例中爲32)。因此,底部圓的中心與連接頂部圓的中心的線之間的距離將是sqrt(3)/ 2倍該值(在本例中爲27.7)。所以,int y_position = 27.7 * y;

0

的Y_POS計算是你的錯誤:

這應該修復它: INT y_position = SIN(PI/3)* diamater * Y;

您可能需要緩存sin(pi/3)來獲得性能。