首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >十六进制地图的生成问题

十六进制地图的生成问题
EN

Stack Overflow用户
提问于 2010-12-12 08:29:32
回答 3查看 604关注 0票数 1

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

代码语言:javascript
代码运行次数:0
运行
复制
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

为什么行之间会有距离?球不是密密麻麻的?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-12 08:31:15

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

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2010-12-12 08:35:58

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

票数 0
EN

Stack Overflow用户

发布于 2010-12-12 08:40:06

y_pos计算是您的错误:

这应该可以解决这个问题: int y_position = sin(pi / 3) * diamater * y;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4419791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档