2010-12-12 32 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)来获得性能。