// 世界场景的一些数据管理,如提供坐标转换之类的接口var WorldMapManager = function () {this.mapSize = null;     // 地图大小,像素this.curViewPos = null;  // 当前大地图视野坐标// 初始化世界地图的数据this.init = function (mapSize, tileSize) {this.mapSize = {width  : globalConsts.WorldMapSize.width * globalConsts.TileSize.width + globalConsts.TileSize.width / 2,height : globalConsts.WorldMapSize.height * ((globalConsts.TileSize.height - globalConsts.TileSize.hex) / 2 + globalConsts.TileSize.hex) + (globalConsts.TileSize.height - globalConsts.TileSize.hex) / 2};this.tileSize = globalConsts.TileSize;};// 大地图坐标转成蜂窝cellthis.mapPosToTile = function (pos) {// 算出缩放成正六边形后边长 a 的值var a = this.tileSize.width / Math.sqrt(3);var x = pos.x, y = (this.mapSize.height - pos.y) / this.tileSize.height * a * 2 + a / 2;    // 加 a / 2 是因为矩形网格计算时会在底部增加 a / 2//位于矩形网格边线上的三个CELL中心点var points = new Array(cc.p(0, 0), cc.p(0, 0), cc.p(0, 0));//当前距离的平方var dist;//      index:被捕获的索引var i, index;//二分之根号3 边长的平方,如果距离比它还小,就必然捕获var g_MinDistance2 = Math.pow(a * Math.sqrt(3) / 2, 2);// 网格宽、高var g_unitx = a * Math.sqrt(3);     //sqrt(3) * avar g_unity = a * 1.5;              //a * 3 / 2// 网格对角线平方向上取整var mindist= Math.ceil(Math.pow(g_unitx, 2) + Math.pow(g_unity, 2));//计算出鼠标点位于哪一个矩形网格中var cx = parseInt(x/g_unitx);var cy = parseInt(y/g_unity);points[0].x = parseInt(g_unitx * cx);points[1].x = parseInt(g_unitx * (cx+0.5));points[2].x = parseInt(g_unitx * (cx+1));//根据cy是否是偶数,决定三个点的纵坐标if(cy % 2 == 0){//偶数时,三个点组成倒立三角points[0].y = points[2].y = parseInt(g_unity * cy);points[1].y = parseInt(g_unity * (cy+1));}    else{//奇数时,三个点组成正立三角points[0].y = points[2].y = parseInt(g_unity * (cy+1));points[1].y = parseInt(g_unity * cy);}// 计算两点间距离的平方function distance2(x1, y1, x2, y2){return ((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));}//现在找出鼠标距离哪一个点最近for(i = 0; i < 3; ++i){//求出距离的平方dist = distance2(x, y, points[i].x, points[i].y);//如果已经肯定被捕获if(dist < g_MinDistance2){index = i;break;}//更新最小距离值和索引if(dist < mindist){mindist = dist;index = i;}}// x 第 0 个点的列值减 1 等于cell.x ( x 最左半格有 -1 值 )// cy 偶数时中间点 + 1,奇数时两边点 + 1,减 1 是因为初始为了计算方便 y 补了 a / 2 ( y 最上半格 也会存在 -1 )return {x : cx - (index > 0? 0 : 1), y : cy + (cy % 2 + index % 2) % 2 - 1};};// 格子坐标转成地图坐标this.tilePosToMap = function (pos) {var tileCenter, xPixel, yPixel;tileCenter = (pos.x * this.tileSize.width) + this.tileSize.width / 2;xPixel = tileCenter + (pos.y % 2) * this.tileSize.width / 2;yPixel = this.tileSize.height / 2 + pos.y * (this.tileSize.height / 2 + this.tileSize.hex / 2);// 因为锚点的关系,y值需要倒过来,这很重要yPixel = this.mapSize.height - yPixel;return cc.p(xPixel, yPixel);};// 获取相邻两个六边形格子中心点距离this.getAdjacentHexagonCenterPointDistance = function (isLeftAndRight) {if (isLeftAndRight) {return this.tileSize.width;} else {return Math.sqrt(Math.pow((this.tileSize.height + this.tileSize.hex) / 2, 2) + Math.pow(this.tileSize.width / 2, 2));}};
};// 单例WorldMapManager.sharedInstance = null;WorldMapManager.getInstance = function(){if (WorldMapManager.sharedInstance == null) {WorldMapManager.sharedInstance = new WorldMapManager();WorldMapManager.sharedInstance.init();}return WorldMapManager.sharedInstance;
};
var tileCalculate = {// 两六边形 tilePos 获取 无视阻挡的最短距离格子数 0~1 return 1getTwoTileDistance : function(lightTilePos, findTilePos) {var offX = 1, offY = 1;   // 初始 findTilePos 在 lightTilePos 左上,往右下寻var tilePos, count;if (lightTilePos.y === findTilePos.y) {return Math.abs(lightTilePos.x - findTilePos.x);} else if (lightTilePos.x === findTilePos.x) {return Math.abs(lightTilePos.y - findTilePos.y);} else {count = 0;tilePos = {x:findTilePos.x, y:findTilePos.y};// 在右,往左寻if (lightTilePos.x < tilePos.x) {offX = -1;}// 在下,往上寻if (lightTilePos.y < tilePos.y) {offY = -1;}do {++count;tilePos.x += tilePos.y % 2 > 0 ? (offX > 0 ? offX : 0) : (offX < 0 ? offX : 0);tilePos.y += offY;} while (lightTilePos.x !== tilePos.x && lightTilePos.y !== tilePos.y);count += Math.abs(lightTilePos.x - tilePos.x) + Math.abs(lightTilePos.y - tilePos.y);return count;}},// 获取格子周围一圈,共六个格子的格子坐标getAroundTilePos : function(tilePos) {if (tilePos.y % 2 > 0) {return [{x : tilePos.x, y : tilePos.y - 1}, {x : tilePos.x, y : tilePos.y + 1}, // 上下{x : tilePos.x - 1, y : tilePos.y}, {x : tilePos.x + 1, y : tilePos.y}, // 左右{x : tilePos.x + 1, y : tilePos.y - 1}, {x : tilePos.x + 1, y : tilePos.y + 1}];    // 右上,右下} else {return [{x : tilePos.x, y : tilePos.y - 1}, {x : tilePos.x, y : tilePos.y + 1}, // 上下{x : tilePos.x - 1, y : tilePos.y}, {x : tilePos.x + 1, y : tilePos.y}, // 左右{x : tilePos.x - 1, y : tilePos.y - 1}, {x : tilePos.x - 1, y : tilePos.y + 1}];    // 左上,左下}},// 获取格子周围两圈,共十八个格子的格子坐标getAroundTwoLapsTilePos : function(tilePos) {var i, j, tiles1, tiles2 = [];var tilePoses = {};// 把第一圈及第一圈每一个的第一圈都收集起来tiles1 = this.getAroundTilePos(tilePos);for (i in tiles1) {tiles2 = this.getAroundTilePos(tiles1[i]);for (j in tiles2) {if (tiles2[j].x !== tilePos.x || tiles2[j].y !== tilePos.y) {tilePoses[JSON.stringify(tiles2[j])] = tiles2[j];}}}return tilePoses;},};

六边形格子地图坐标计算与转换相关推荐

  1. 六边形格子地图的基本实现

    六边形格子地图的基本实现 基本思路 这是一张大小为 21 × 15 的六边形格子地图 我们将左上角的格子定义为 (1, 1) 则部分地图的坐标如下 易知: 若起点为(x, y) 当y为奇数时 可以前往 ...

  2. Cocos2d-JS tiledMap 45度角地图坐标计算

    直接进入主题,公式如下 this.cellXCount = tmxMap.getMapSize().width; this.cellYCount = tmxMap.getMapSize().heigh ...

  3. 地图坐标计算原理与技巧

    在做地图显示一定距离内附近商家功能时,对地图距离计算产生了很大好奇,拜读某大佬的文章后,略有心得,遂转发收藏,下面是原文地址. 原文跳转地址

  4. 微信公众号h5界面获取展示微信内置地图与地图坐标间的转换 — 微信地图(gcj02)转为百度地图

    此文章中实例用测试号进行演示 .getLocation openLocation 主要运用微信JS-SDK,微信JS-SDK是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包.通过使用微信 ...

  5. 45度角地图坐标计算

    已知图片上的一个触摸点,怎么求其落在地图的哪个瓦块上? 已知: 瓦块尺寸64*32pt, 瓦块数20*20, 地图尺寸1280*640pt如图, 图片的原点是o1 地图原点是o2 向量: o1p, o ...

  6. 45度角地图坐标计算 和 层级计算

    //2个方块x的距离 xdis = 38 //2个方块y的距离 ydis = -19 //传入 XY 下标 获取坐标   45度角地图 getPositonByXY(_x :number, _y :  ...

  7. 高德地图根据地图坐标计算缩放比例,显示出所有坐标点

    map.setFitView()这个属性 demo地址:https://developer.amap.com/demo/javascript-api/example/marker/adaptive-s ...

  8. java gps 距离计算_Java教程之地图中计算两个GPS坐标点的距离

    原标题:Java教程之地图中计算两个GPS坐标点的距离 在日常开发中,我们难免要计算两个左边之间的距离,但是地图软件api的接口普遍要求我们必须要先将坐标点传递到他们服务器,然后计算出一个距离返还给我 ...

  9. 地图坐标格式转换工具

    地图坐标格式转换工具 1.经纬度转换 ,度转度分秒 /*** 经纬度转换 ,度转度分秒* @param str 度数 116.418847* @return 116°25'7.85"*/pu ...

最新文章

  1. pgsql 两个时间字段相减_如何在Excel做专业的时间序列分析
  2. UVA 270 Lining Up
  3. php amp ldquo 转换,php与html代码的若干转换
  4. 查看约束信息_【华智产品汇】育种信息安全的守护者——华智育种管家
  5. python 赋值重置_Python所有赋值语句快速预览
  6. kali linux 桌面消失_kalilinux系统设置不见了的解决方案
  7. android monkey优化,GitHub - baozhida/AndroidMonkey: 这个项目是CrashMonkey4Android可执行文件,修复了一些bug,做了一些优化...
  8. 阿里扔给腾讯一个烫手山芋
  9. 使用计算机教学的意义,信息技术在教学中的作用
  10. eclipse-java-2018-09-win32-x86_64配置tomcat(内含更新eclipse,如何解决添加时找不到最新tomcat版本)...
  11. opentsdb+grafana监控系按使用总结
  12. 连接超时_记一次网络请求连接超时的事故
  13. 【word】为什么word分两栏的最后一页左边一栏没写完跑到右边去了
  14. javascript-mqtt
  15. usermod+用户密码管理+mkpasswd
  16. 浏览器的语音识别功能
  17. ae去闪插件deflicker使用_ae去闪烁插件Flicker Free怎么用-ae去闪烁插件Flicker Free的使用教程 - 河东软件园...
  18. 卷积神经网络CNN——使用keras识别猫咪
  19. Day 2 WebAPIs 实例
  20. NS3入门:第一个程序first.cc

热门文章

  1. iOS 无法添加 push notifications
  2. 各种格式文件ocr成word文件的方法
  3. 电流检测电阻的原理与运用
  4. python 将MP3格式转换为WAV格式(ffmpeg安装,使用pycharm安装包)
  5. 算力新话题,畅聊算力之新民生
  6. dm3730 android,DM3730/AM3715处理器开发板
  7. go语言模拟网站登录并爬虫
  8. 企业微信点餐系统读后感
  9. 华为OD机试 - 新员工座位安排系统(Python) | 机试题算法思路
  10. 用 GSConv+Slim Neck 一步步把 Yolov5 提升到极致