独立游戏吧 关注:56,958贴子:329,997
  • 10回复贴,共1

【不逗比的数学公式】鼠标在六边形和平行四边形格子的区域判定

只看楼主收藏回复

之前简化公式的时候用代数 c = roleId*root3/2带入的, 结果简化完把后面的root3/2忘记了搞出个逗比的公式....
这两天抽空重新计算了下,并带来了一个新的更容易理解的公式。
二楼更容易理解的新公式
三楼原公式修正,代码最少的公式
四楼变形格子判定公式,用四边形做的例子,此公式可以配合二三楼的六边形甚至任何形状的二维图形偏移都可以。
另外关于说公式法耗时比较多和 float误差 在大型地形会导致偏移的问题。
首先这些公式是通用公式,不受屏幕大小,缩放,边界等影响。而数组缓存是针对项目的,数组必须和格子占屏幕像素的大小保持一致才可以,或许缩小没问题,放大在边缘上一定会不准,也不能处理小数情况下的边界。不过数组也有好处,其实就是提前算出区域内格子的计算结果,可以在不改动代码的情况下更换任意的格子形状。之前说那些细微问题其实也是在抬杠,因为玩家肯定无法分辨小于一两个像素的误差^^。所以我把你的做法也链接过来了。
http://hi.baidu.com/rvcrdmzbvrbemtq/item/af8a5789b499e2deee083d6f
如果根据项目对格子进行一些限定,公式可以继续简化。而且这些公式的耗时完全可以忽略不计,没有用到任何耗时的计算处理单元,即使有些开方三角函数之类的也都是常量无需没帧计算。
float要是怕有误差可以用double, double要是还有误差可以每过几千万个格子设置个偏移量依然可以保证误差在允许范围之内。


IP属地:上海1楼2014-08-05 23:16回复
    roleHeight 用于将不同大小的六边形格子转成单位为1的标准格子。实际数值需要根据你们自己项目的格子大小来填。
    [roleId, lowerHeight] 和 [roleId+1,upperHeight] 可以讲鼠标位置定位缩小到两个坐标之间
    根据几何可以得知鼠标位置距离哪个格子近,即在那个格子里面。



    IP属地:上海2楼2014-08-05 23:18
    回复
      2025-09-02 20:56:52
      广告
      不感兴趣
      开通SVIP免广告
      这个大体跟前面一样,只不过判断距离的公式被改成了根据分割两个格子的直线公式判断鼠标在那边即使那个格子。这个纯粹是无聊为了省代码行数加让人觉得高大上才这么干的。



      IP属地:上海3楼2014-08-05 23:19
      回复
        这个是判断任意平行四边形的。
        任意平行四边形都可以看成是正方形通过旋转和拉伸产生的变形。
        我们只要找到变形的角度和缩放即可还原到正方形格子然后求出坐标所在格子。
        需要用到的三角函数依然是常量可以提前计算的。以菱形为例子

        将正方形旋转45度然后在x,y方向上进行缩放即可得到菱形。那么只要将获得的屏幕坐标反方向缩放再旋转-45度就回到了原始的正方形的坐标系。
        任何其他形状的旋转拉伸也可以用这样的方法处理回去进行计算。


        IP属地:上海4楼2014-08-05 23:20
        回复
          二楼的无系统函数的完整版,可以看到完全没有使用任何复杂的运算。 随便写个角色的逻辑运算都不知道比这个复杂多少倍。


          IP属地:上海5楼2014-08-05 23:23
          回复
            @ upupzealot
            看在我为了写完这个都没有陪我们家小喵玩被怒抓一道血印的份上加个精吧…………


            IP属地:上海6楼2014-08-05 23:27
            收起回复


              IP属地:北京来自iPhone客户端7楼2014-08-06 00:35
              回复
                用公式法在手游上用还是挺广泛的,现在的机子性能跑这个完全没问题。


                8楼2014-09-23 09:12
                回复
                  2025-09-02 20:50:52
                  广告
                  不感兴趣
                  开通SVIP免广告
                  不错


                  9楼2014-09-23 10:00
                  回复