六边形网格通常用于战棋类游戏,目的是提供比四边形地图更平滑的距离体验(尤其是圆看起来更像圆了)。关于他的好处和坏处我不想多说,通常来讲,大家会认为他的计算复杂度要远高于四边形地图。

实际上大多数的六边形地图看起来是这样:

1,1 --- 2,1 --- 3,1 --- 4,1

--- 1,2 --- 2,2 --- 3,2 --- 4,2

1,3 --- 2,3 --- 3,3 --- 4,3

--- 1,4 --- 2,4 --- 3,4 --- 4,4

这确实使得我们在距离计算上出现了一些麻烦(有兴趣的朋友可以自行推导距离公式)

但是最近我发现,如果我们改变一下坐标排布,那么很多事情会变得简单起来

(当然,虽然大多数市面上游戏都是上面这样显示的,但他们底层的算法并不公开,所以不能说明他们的坐标系就是这么设计的,但三国志11显示了每个格子的坐标,这使得我常年以来是按照他的方式去设计坐标系的,也许更多游戏早就采用了我下面所说的方法吧)

当我尝试着将坐标系调整成:

1,1 --- 2,1 --- 3,1 --- 4,1

--- 1,2 --- 2,2 --- 3,2 --- 4,2

--- --- 1,3 --- 2,3 --- 3,3 --- 4,3

--- --- --- 1,4 --- 2,4 --- 3,4 --- 4,4

我惊讶的发现,距离公式变成了

d = min( dx+dy, max(dx, dy))

其中dx,dy分别是两点x,y坐标差的绝对值(实际上,两点连线斜率为负时,是max(dx,dy),否则是dx+dy)

这使得很多计算变得简单了,而且在这种排布中,我们共有三条简单的直线:x = k,y=k,x+y=k(在老的排布中,x=k要换成x-y=k)

遍历临近单元格的步骤也更清晰:

考虑距离x,y为r的格子,他们的坐标满足

x' = x-r, y' = y+0 ~ y+r

x' = x+r, y' = y-0 ~ y-r

y' = y-r, x' = x+0 ~ x+r

y' = y+r, x' = x-0 ~ x-r

x' = x'+1~ x'+(r-1), y' = y'+(r-1) ~ y'+1

x' = x'-1~ x'-(r-1), y' = y'-(r-1) ~ y'-1

这样的六段遍历

如果想要遍历r以内的单元格则更简单,单纯的按照四边形遍历法的二重循环,加上一个附加条件i+j >= x+y-r && i+j <= x+y+r即可

唯一的问题在于,这样的地图看起来是平行四边形而不再是长方形,这使得我们需要对地图进行一个预裁剪,将某些格子标记为边界外,但这个小小的不便远远无法抵消中间大量计算的简化。更何况,如果想做文明那样的环形地图,甚至不需要裁剪,因为平行四边形本身就可以完美自拼接

python六边形网格_六边形网格地图算法细节介绍相关推荐

  1. 人工鱼群算法python代码_人工鱼群算法python_鱼群算法 - Brillou的个人空间 - OSCHINA - 中文开源技术交流社区......

    本算法是参照李晓磊博士的论文实现的,详细的算法原理可阅读<一种新型的智能优化方法_人工鱼群算法_李晓磊> 算法基于鱼群的生存行为:在一片水域中,鱼存在的数目最多的地方就是本水域中富含营养物 ...

  2. 排序算法python实现_合并排序算法– Java,C和Python实现

    排序算法python实现 Merge sort is one of the most efficient sorting algorithms. It works on the principle o ...

  3. slope one 推荐算法python 代码_协同推荐算法实践之Slope One的介绍(转)

    Slope One 之一 : 简单高效的协同过滤算法(转)(

  4. 多元线性回归算法python实现_手写算法-Python代码推广多元线性回归

    1.梯度下降-矩阵形式 上篇文章介绍了一元线性回归,包括Python实现和sklearn实现的实例.对比,以及一些问题点,详情可以看这里: 链接: 手写算法-Python代码实现一元线性回归 里面封装 ...

  5. 中文分词算法python代码_中文分词算法之最大正向匹配算法(Python版)

    最大匹配算法是自然语言处理中的中文匹配算法中最基础的算法,分为正向和逆向,原理都是一样的. 正向最大匹配算法,故名思意,从左向右扫描寻找词的最大匹配. 首先我们可以规定一个词的最大长度,每次扫描的时候 ...

  6. apriori算法python代码_通俗易懂Apriori算法及Python实现

    本篇分为三个部分: 一.算法背景 啤酒与尿布故事: 某超市为增加销售量,提取出了他们超市所有的销售记录进行分析.在对这些小票数据进行分析时,发现男性顾客在购买婴儿尿片时,通常会顺便搭配带打啤酒来犒劳自 ...

  7. 正向最大匹配算法 python代码_中文分词算法之最大正向匹配算法(Python版)

    最大匹配算法是自然语言处理中的中文匹配算法中最基础的算法,分为正向和逆向,原理都是一样的. 正向最大匹配算法,故名思意,从左向右扫描寻找词的最大匹配. 首先我们可以规定一个词的最大长度,每次扫描的时候 ...

  8. 数据结构与算法python描述_数据结构与算法——Python语言描述.pdf

    数据结构与算法--Python语言描述.pdf 欢迎加入非盈利Python编学习交流程QQ群783462347,群里免费提供500+本Python书籍! 欢迎加入非盈利Python编程学习交流程QQ群 ...

  9. python 旋转矩阵_【每日算法Day 93】不用额外空间,你会旋转一个矩阵吗?

    第 100 天时,我可能会对这 100 天以来的算法题进行一个总结,然后暂时停止更新 LeetCode 题解了. 下一步可能更新 NLP 相关算法了,非常感谢大家每天的支持. 题目链接 LeetCod ...

  10. 蓄水池采样算法的python实现_蓄水池采样算法的python实现_蓄水池抽样及实现

    蓄水池抽样(Reservoir Sampling)是一个很有趣的问题,它能够在o(n)时间内对n个数据进行等概率随机抽取,例如:从1000个数据中等概率随机抽取出100个.另外,如果数据集合的量特别大 ...

最新文章

  1. 如何在主机win10和虚拟机(virtualbox)中的Ubuntu进行文件传输即共享文件夹的建立
  2. 基于Gitolite的Git服务架设
  3. C 标准转换运算符const_cast
  4. angular 多个片段拼接_教你怎么用手机制作和拼接短视频?
  5. Leetcode---Java
  6. 慢雾安全工程师:安全审计是目前保护 DeFi 项目安全最高性价比的方式
  7. Jetty与Tomcat的区别 转
  8. centos8安装mysql_Linux宝塔面板安装
  9. Ubuntu U盘终于见到了它的主人
  10. ubuntu 1804.1 升级失败:Hash Sum mismatch
  11. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_1 回顾Mybatis的环境搭建-实现查询所有功能
  12. java编程思想视频教程 零基础如何学Java
  13. 基于SSM的社区宠物信息管理系统
  14. 2019仿互站网源码T5友价内核PC+社区+博客+手机+整站数据 全新运营
  15. vbs代码未结束的字符串常量
  16. java poi word 复制_java poi实现word导出(包括word模板的使用、复制表格、复制行、插入图片的使用)...
  17. Linux基础学习笔记(持续更新)
  18. Linux中修改httpd默认端口
  19. MATLAB学习心得~
  20. [图像处理]-Opencv中数据类型CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F是什么?

热门文章

  1. 机器学习_深度学习毕设题目汇总——漫画
  2. Android 逆向笔记 —— 说说 Dalvik 及其指令集
  3. JVM结构和JVM的架构模型以及JAVA生命周期介绍
  4. 微软修改 MIT 项目原作者版权声明引发争议;白宫为提高开源安全性邀请软件行业者座谈;Ruby 3.1.0 发布 | 开源日报
  5. TD-LTE无线帧中Tf和Ts是什么?
  6. 阿拉伯数字翻译成中文的大写数字
  7. 加密的pdf文件如何解密?
  8. 弘辽科技:揭秘淘宝直通车更深层的秘密,你开对车了吗?
  9. 电脑扬声器没有声音,插上耳机也检测不到
  10. 【和小冉一起学习c++】踏入c++的大门~第一个c++程序