我有一个构建十六进制映射的代码:
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
为什么行之间有距离?球没有密集地躺着?
谢谢!
答案 0 :(得分:2)
您正在尝试生成hexagonal packing,而不是方形包装。
圆心之间的垂直距离应小于直径,因为第二行的顶部填充第一行底部之间的孔,导致前两行的边界框略微重叠。请注意,在第一张图片中只有五行圆圈,但在第二张图片中有六行,尽管第二张包装不会占用更多的垂直空间。
行之间的实际高度差是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)以提高性能。