在Flash中绘制六边形网格?

4
什么是通过算法绘制六边形网格的最简单方法?我应该如何在数据中呈现它们?
例如,在一个方形网格中,我只需要保存x-y坐标即可...

1
十六进制坐标,当然啦! :P - Matt Ball
2个回答

7

6

有几种方法来管理六角地图坐标,其中大多数不合直觉的坚持将它们映射到x-y坐标系中,这只对渲染很重要。一些极坐标通常是最好的。我有一个perl库,用于管理大多数矢量计算,非常适用于点参考计算,如AI和其他搜索树。

http://en.wikipedia.org/wiki/Polar_coordinate_system

对于便宜的座位,极坐标将一个点作为原点(就像标准的x-y笛卡尔图形),选择一个向量作为基线(与笛卡尔相似),然后指定点为(大小,度数)。
在六边形地图中,这真正命中要害的是每个纯角度都是60度的倍数。如果为每个六边形边分配一个面朝方向((a,b,d,e,f,g))并应用一个向量作为大小和面朝方向,就会出现几个有用的属性。

1) 每个十六进制数都可以表示为两个相邻向量的和(或者第二个向量是0或单位元素的单个向量)。例如,1a+1b = 1a1b或1b1a。无论哪种方式,它都是对2个十六进制数的遍历,一个大小为2,并指定了从原点(0,0)到唯一十六进制数。 2) 非相邻向量总是可以应用以下规则简化为两个相邻向量: 2) 取反:1A + 1D = 0,1B + 1E = 0,1C + 1F = 0,例如 3) 组合:1A + 1C = 1B,1B + 1D = 1C,1C + 1E = 1D,1D + 1F = 1E,1E + 1A = 1F

记住这些原则,一个必须穿越实际空间的导弹,需要将向量保留为更小的遍历的连接或顺序。1A + 1A + 1C + 1C表示导弹向外行进两个六边形,然后急转弯(120度)并行进两个六边形,结束其遍历,只有2个六边形远但与初始方向偏离60度。
然而,目标计算机或结果爆炸可能只关心范围,因此使用这些规则简化这些向量可能很重要。要计算任意两点之间的最短距离,只需连接向量并简化它们即可。
创建一个六边形地图并呈现它也很容易。 创建一个Hex对象作为原点,具有属性:大小=0,向量=NULL,标签(可选)=一些字符串(我喜欢将其设置为人类可读值),名称=0(大小和向量的连接),出口=数组(您将填充6个节点,除非有蠕虫洞或其他)。 在您选择的像素中心上绘制原点以使地图居中。 渲染六边形。 选择地图的半径。

针对每一个量级,使用相邻向量的每一种组合填充环。有很多方法可以实现这个过程,但最简单的方式是选择一个向量作为基础,然后在一个适当的方向和轨道上遍历该量级下的六边形。例如:对于量级 3,在点 3E 开始,接着依次遍历 3A、3B、3C、3D、3E、3F,并将每个六边形都计算为前一个所遍历的六边形与新的单个六边形向量之和。

在每个六边形中,应用一些三角函数来计算中心像素相对于原始像素的位置,并渲染该六边形。

希望这能对某些人有所帮助。六边形地图非常棒,但渲染它们有点麻烦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接