我有一个构建十六进制映射的代码:
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
为什么行之间会有距离?球不是密密麻麻的?
谢谢!
发布于 2010-12-12 00:31:15
您正在尝试生产hexagonal packing,而不是方形包装。
圆中心之间的垂直距离应该小于直径,因为第二行的顶部填充了第一行底部之间的孔,导致前两行的边界框略有重叠。请注意,在第一张图片中只有五行圆圈,但在第二张图片中有六行,尽管第二个填充不会占用更多的垂直空间。
行之间的实际高度差是边等于圆直径的height of an equilateral triangle,例如,可以使用Pythagorean Theorem计算。
试试y_position = sqrt(3)/2 * diameter * y
。
发布于 2010-12-12 00:35:58
三个相邻圆的中心形成一个等边三角形,边长度为直径(在您的示例中为32)。因此,底部圆的中心与连接顶部圆中心的直线之间的距离将是sqrt(3)/2乘以该值(在您的示例中为27.7)。所以,int y_position = 27.7 * y;
发布于 2010-12-12 00:40:06
y_pos计算是您的错误:
这应该可以解决这个问题: int y_position = sin(pi / 3) * diamater * y;
您可能希望缓存sin(pi/3)以提高性能。
https://stackoverflow.com/questions/4419791
复制