处理六边形网格的类和函数

hexutil的Python项目详细描述


hexutil
==


处理六角形网格的类和函数。


[示例截图.py]


Introduction
----


此模块提供以下功能。

1。六角形网格中网格坐标的操作。六角形网格坐标与屏幕坐标之间的转换。六角形网格上的视场计算。
4.在六角形网格上寻找路径。

所有这些都是由hexutil模块提供的。文件example.py包含使用此功能的示例编码。上图是本例中的屏幕截图



hex有两个整型参数x和y。它们需要满足
属性,即它们的和是偶数的。


下面的(x,y)坐标系用于处理
网格中的六边形。

[hex grid坐标系]

系统在表示中留下"孔",即没有对应于(0,1)的六边形。然而,这在实践中并不是一个真正的问题。
优点是与
六边形的实际中心点的关系变得非常简单,即只需将y乘以√3。这也简化了屏幕坐标计算。


"孔"是唯一一个问题的时候是,如果你想将网格数据密集地打包到2d(numpy)数组或列表列表中。在这种情况下,只需使用ar[hexagon.x//2][hexagon.y]索引到数组ar中即可。hex的构造函数检查"x+y是偶数"属性。如果不满足,则抛出invalidhex异常。

这意味着它可以在需要
2元组(x,y)的地方使用。这也意味着它是不可变的。

hex实例上的重要功能。*分别用于访问x坐标和y坐标的hex.x和hex.y
字段。*算术
支持hex1+hex2、hex1-hex2和-hex运算。*
方法hex.neighbors()返回十六进制的6个直接邻接。*
方法hex1.distance(hex2)返回hex1和hex2之间的
六边形网格上的步数距离。

六边形网格坐标和屏幕坐标之间的转换。
屏幕的六边形(像素)坐标可以用宽度和高度两个参数来描述。下图显示了这些
与六边形尺寸的关系。

[六边形网格的宽度和高度]


对于完全规则的六边形,关系高度=_√3 width
。实际上,我们通常需要整数像素坐标。

hexgrid类捕获这样一对宽度和高度值。它可以初始化为hexgrid(宽度、高度)或hexgrid(宽度)。在
后一种情况下,高度自动计算为圆形(_√3*宽度)。


十六进制实例的重要功能。*hexgrid.width和
hexgrid.height字段分别用于访问宽度和高度。
*方法hexgrid.center(hex)返回一对屏幕坐标
hex的中心。*方法hexGrid.corners(hex)返回hex的6个角的屏幕坐标的6对(x,y)的序列
。*
方法hexgrid.bounding_box(hex)返回一个hexutil.rectangle对象
描述hex的边界框。*方法
hexgrid.hex_at_坐标(x,y)返回屏幕坐标
(x,y)处的hex。*方法hexGrid.hex es_In_Rectangle(rect)返回与矩形rect重叠的所有十六进制的序列。

----

视场计算通过以下方法对十六进制实例进行。


您可以查看
-visible——如果提供,应该是一个将被填充的dict,并且
返回

返回一个dict,该dict的键是可见的六边形。
值是一个位掩码,指示六边形的哪些边
可见。如果您还想使用此函数来计算光源,则位掩码很有用。


view_set=player_pos.field_of_view(…)
light_set=light_source.field_of_view(…)

pos是否可见?
如果view_set.get(pos,0)和light_set.get(pos,0):
是的,它是在六边形网格上的

----------


path查找(使用a*算法)是通过以下方法在
hex实例上完成的。

hex.find_path(self,destination,passable,cost=lambda pos:1)


-hex——路径查找的起始位置(hex对象)。
-destination——路径查找的目标位置。
-passable——一个位置的函数,如果我们可以通过这个hex移动
,则返回true。
-cost——cos通过十六进制的T函数。应返回a
值≥1。默认情况下,所有成本为1。

这将返回路径(作为十六进制序列,包括起点
和目的地),如果找不到路径,则返回无路径。







欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
部署在kubernetes上时,微服务中服务间通信中的java连接超时问题   java Nway合并对2G字符串文件进行排序   java如何使用FlexJson按特定顺序序列化对象和属性   如何在java布尔方法中导入文本文件   swing需要帮助在我的Java GUI中实现用户输入的侦听器   java如何读取枚举中Spring Messagesource的内容?   每个Ajaxcall上(之前和之后)的java Javascript   java compareTo(Comparable)方法对于Comparable类型未定义   带换行符的java Bash输入重定向   使用Spring授权标记检查用户是否登录时发生java错误?   使用大尺寸(100000)数组执行快速排序时出现Java StackOverflower错误   java forEach迭代器标记   Java ClassNotFound异常,Maven依赖项作为JAR   java将HQL转换为SQL查询   java正在将片段列表发送到FragmentPagerAdapter   java onActivityResult应该调用super。onActivityResult   java如果我导入一个超类,我也需要导入它的子类吗?   java是否可以通过openid协议对aadhar进行身份验证