python六边形网格_六边形网格地图算法细节介绍
六边形网格通常用于战棋类游戏,目的是提供比四边形地图更平滑的距离体验(尤其是圆看起来更像圆了)。关于他的好处和坏处我不想多说,通常来讲,大家会认为他的计算复杂度要远高于四边形地图。
实际上大多数的六边形地图看起来是这样:
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六边形网格_六边形网格地图算法细节介绍相关推荐
- 人工鱼群算法python代码_人工鱼群算法python_鱼群算法 - Brillou的个人空间 - OSCHINA - 中文开源技术交流社区......
本算法是参照李晓磊博士的论文实现的,详细的算法原理可阅读<一种新型的智能优化方法_人工鱼群算法_李晓磊> 算法基于鱼群的生存行为:在一片水域中,鱼存在的数目最多的地方就是本水域中富含营养物 ...
- 排序算法python实现_合并排序算法– Java,C和Python实现
排序算法python实现 Merge sort is one of the most efficient sorting algorithms. It works on the principle o ...
- slope one 推荐算法python 代码_协同推荐算法实践之Slope One的介绍(转)
Slope One 之一 : 简单高效的协同过滤算法(转)(
- 多元线性回归算法python实现_手写算法-Python代码推广多元线性回归
1.梯度下降-矩阵形式 上篇文章介绍了一元线性回归,包括Python实现和sklearn实现的实例.对比,以及一些问题点,详情可以看这里: 链接: 手写算法-Python代码实现一元线性回归 里面封装 ...
- 中文分词算法python代码_中文分词算法之最大正向匹配算法(Python版)
最大匹配算法是自然语言处理中的中文匹配算法中最基础的算法,分为正向和逆向,原理都是一样的. 正向最大匹配算法,故名思意,从左向右扫描寻找词的最大匹配. 首先我们可以规定一个词的最大长度,每次扫描的时候 ...
- apriori算法python代码_通俗易懂Apriori算法及Python实现
本篇分为三个部分: 一.算法背景 啤酒与尿布故事: 某超市为增加销售量,提取出了他们超市所有的销售记录进行分析.在对这些小票数据进行分析时,发现男性顾客在购买婴儿尿片时,通常会顺便搭配带打啤酒来犒劳自 ...
- 正向最大匹配算法 python代码_中文分词算法之最大正向匹配算法(Python版)
最大匹配算法是自然语言处理中的中文匹配算法中最基础的算法,分为正向和逆向,原理都是一样的. 正向最大匹配算法,故名思意,从左向右扫描寻找词的最大匹配. 首先我们可以规定一个词的最大长度,每次扫描的时候 ...
- 数据结构与算法python描述_数据结构与算法——Python语言描述.pdf
数据结构与算法--Python语言描述.pdf 欢迎加入非盈利Python编学习交流程QQ群783462347,群里免费提供500+本Python书籍! 欢迎加入非盈利Python编程学习交流程QQ群 ...
- python 旋转矩阵_【每日算法Day 93】不用额外空间,你会旋转一个矩阵吗?
第 100 天时,我可能会对这 100 天以来的算法题进行一个总结,然后暂时停止更新 LeetCode 题解了. 下一步可能更新 NLP 相关算法了,非常感谢大家每天的支持. 题目链接 LeetCod ...
- 蓄水池采样算法的python实现_蓄水池采样算法的python实现_蓄水池抽样及实现
蓄水池抽样(Reservoir Sampling)是一个很有趣的问题,它能够在o(n)时间内对n个数据进行等概率随机抽取,例如:从1000个数据中等概率随机抽取出100个.另外,如果数据集合的量特别大 ...
最新文章
- 如何在主机win10和虚拟机(virtualbox)中的Ubuntu进行文件传输即共享文件夹的建立
- 基于Gitolite的Git服务架设
- C 标准转换运算符const_cast
- angular 多个片段拼接_教你怎么用手机制作和拼接短视频?
- Leetcode---Java
- 慢雾安全工程师:安全审计是目前保护 DeFi 项目安全最高性价比的方式
- Jetty与Tomcat的区别 转
- centos8安装mysql_Linux宝塔面板安装
- Ubuntu U盘终于见到了它的主人
- ubuntu 1804.1 升级失败:Hash Sum mismatch
- 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_1 回顾Mybatis的环境搭建-实现查询所有功能
- java编程思想视频教程 零基础如何学Java
- 基于SSM的社区宠物信息管理系统
- 2019仿互站网源码T5友价内核PC+社区+博客+手机+整站数据 全新运营
- vbs代码未结束的字符串常量
- java poi word 复制_java poi实现word导出(包括word模板的使用、复制表格、复制行、插入图片的使用)...
- Linux基础学习笔记(持续更新)
- Linux中修改httpd默认端口
- MATLAB学习心得~
- [图像处理]-Opencv中数据类型CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F是什么?
热门文章
- 机器学习_深度学习毕设题目汇总——漫画
- Android 逆向笔记 —— 说说 Dalvik 及其指令集
- JVM结构和JVM的架构模型以及JAVA生命周期介绍
- 微软修改 MIT 项目原作者版权声明引发争议;白宫为提高开源安全性邀请软件行业者座谈;Ruby 3.1.0 发布 | 开源日报
- TD-LTE无线帧中Tf和Ts是什么?
- 阿拉伯数字翻译成中文的大写数字
- 加密的pdf文件如何解密?
- 弘辽科技:揭秘淘宝直通车更深层的秘密,你开对车了吗?
- 电脑扬声器没有声音,插上耳机也检测不到
- 【和小冉一起学习c++】踏入c++的大门~第一个c++程序