十六进制映射的创建问题

时间:2010-12-12 00:29:32

标签: java map hex

我有一个构建十六进制映射的代码:

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

为什么行之间有距离?球没有密集地躺着?

谢谢!

3 个答案:

答案 0 :(得分:2)

您正在尝试生成hexagonal packing,而不是方形包装。

alt text

圆心之间的垂直距离应小于直径,因为第二行的顶部填充第一行底部之间的孔,导致前两行的边界框略微重叠。请注意,在第一张图片中只有五行圆圈,但在第二张图片中有六行,尽管第二张包装不会占用更多的垂直空间。

行之间的实际高度差是height of an equilateral triangle,其边长等于圆的直径,例如,可以使用Pythagorean Theorem计算。

尝试y_position = sqrt(3)/2 * diameter * y

答案 1 :(得分:0)

三个相邻圆的中心形成等边三角形,边长为直径(在您的示例中为32)。因此,底部圆的中心与连接顶部圆的中心的直线之间的距离将是该值的sqrt(3)/ 2倍(在您的示例中为27.7)。所以,int y_position = 27.7 * y;

答案 2 :(得分:0)

y_pos计算是你的错误:

这应该解决它:  int y_position = sin(pi / 3)* diamater * y;

您可能希望缓存sin(pi / 3)以提高性能。