游戏地图中两点坐标相对的方向(角度)判断

八方向坐标的游戏地图中,怪物( pos1 )要向玩家( pos2 )发起技能攻击的时候,需要计算出玩家 ( pos2 ) 相对于怪物 ( pos1 ) 所处的方向才能使技能正确攻击到玩家。下面我们来看一段 秦美人实现的判断两个坐标相对方向的代码:

                     double   angle = Math.  atan ((( double ) (pos2.getY() – pos1.getY())) / -(pos2.getX() – pos1.getX()));

                     double   angle22d5 = Math.   PI   / 8;

                     double   angle67d5 = Math.   PI   / 2 – angle22d5;

                     if   (angle > -angle22d5 && angle <= angle22d5) {

                           if   (pos1.getX() < pos2.getX()) {

                                 return   2;

                        }   else   {

                                 return   6;

                        }

                  }   else   if   (angle > angle22d5 && angle <= angle67d5) {

                           if   (pos1.getX() < pos2.getX()) {

                                 return   1;

                        }   else   {

                                 return   5;

                        }

                  }   else   if   (angle > -angle67d5 && angle <= -angle22d5) {

                           if   (pos1.getX() < pos2.getX()) {

                                 return   3;

                        }   else   {

                                 return   7;

                        }

                  }   else   {

                           if   (pos1.getY() < pos2.getY()) {

                                 return   4;

                        }   else   {

                                 return   0;

                        }

                  }

首先第一行   double   angle = Math.  atan ((( double ) (pos2.getY() – pos1.getY())) / -(pos2.getX() – pos1.getX())),这是计算玩家 ( pos2 ) 与怪物 ( pos1 ) 两点直线与x轴正方向的夹角弧度值,atan()中的参数 是计算两点直线的一个斜率( 直线斜率公式:k= ),公式中的负号是作了笛卡儿坐标系统对计算机屏幕坐标系统的坐标转换。

笛卡儿坐标系统中x轴向右为正值,y轴向上为正值;计算机屏幕坐标系统中因为起点在屏幕左上角,虽然x轴同样向右是正值,而y轴却是向下为正值。上图是将 红色坐标(笛卡儿坐标系统)转换为 绿色坐标 (计算机屏幕坐标系统)的过程。

附:同 atan等价的 atan2 弧度计算公式: Math.  atan2 ((( double ) (pos2.getY() – pos1.getY())), ( double ) (pos2.getX() – pos1.getX()))

 

如上图所示两个方向之间的夹角是45度,每个方向占有区域范围也是45度(分别共享相邻两个方向间夹角的一半)。 代码中的 double   angle22d5 = Math.   PI   / 8是计算坐标系中22.5度角的弧度值,等价于 22.5 * Math.   PI   /180 , double   angle67d5 = Math.   PI   / 2 – angle22d5即是计算 坐标系中67.5度角的弧度值,现在通过计算好的玩家( pos2 )相对于怪物( pos1 )两点直线与x轴正方向的夹角弧度和x座标的相对位置,就可以判断玩家( pos2 )相对于怪物( pos1 )正确方向了。

PS:要感谢一下我们的数学教父(肥皂哥)提供的数学支持!

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值