热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

游戏编程实用技能:2D游戏中坐标转换

游戏里面经常用到坐标转换,例如地图、战斗技能等。一、直角坐标和极坐标的转换前提条件:1、两坐标系原点重合2、两坐标系x轴正半轴重合3、两坐标系单位长度相

游戏里面经常用到坐标转换,例如地图、战斗技能等。

一、直角坐标和极坐标的转换

前提条件:

1、两坐标系原点重合

2、两坐标系x轴正半轴重合

3、两坐标系单位长度相同

变量关系:
 


如上图,M的直角坐标为(x,y),极坐标(ρ,Θ)。

由图中关系可以得出

ρ^2 = x^2 + y^2 (勾股定理)

tanΘ = y/x

x = ρ*cosΘ

y = ρ*sinΘ

其他象限的就不证明了,这里不是讲数学的。知道是一样就行了。

代码如下:
 

  1. #include   
  2. //把直角坐标转换成极坐标  
  3. void changeXYToPolarCoordinate(int x, int y, int& r, int& angle)  
  4. {  
  5.     if (x == 0)  
  6.     {  
  7.         r = abs( y);//x轴为0,r等于y的绝对值  
  8.         if ( y <0)//y小于0是270°  
  9.         {  
  10.             angle &#61; 270;  
  11.         }  
  12.         else if ( y > 0)//y大于0是90°  
  13.         {  
  14.             angle &#61; 90;  
  15.         }  
  16.         else//原点  
  17.         {  
  18.             angle &#61; 0;  
  19.         }  
  20.     }  
  21.     else  
  22.     {  
  23.         r &#61; sqrt( x* x &#43; y* y);  //与原点的距离  
  24.         angle &#61; asin( y / r);   //反正弦函数  
  25.     }  
  26.       
  27. }  
  28. //把极坐标转换成直角坐标  
  29. void changePolarCoordinateToXY(int& r, int& angle, int& x, int& y)  
  30. {  
  31.      x &#61; r * cos(angle);  
  32.      y &#61; r * sin(angle);  
  33. }  


二、绝对坐标和相对坐标的转换
 


如图中坐标系O和坐标系A&#xff0c;原点分别是O(0,0),A(xa,ya).这个相对坐标系A的x轴和y轴是跟坐标系O的x轴和y轴分别平行的。

对于B(xb,yb)的相对坐标是&#xff08;xb-xa,yb-ya&#xff09;

就这么简单。

但是&#xff0c;如果A的坐标轴跟O的不平行呢&#xff1f;看下图

说一下运用的背景&#xff0c;例如怪物A身上有个喷火技能&#xff0c;释放技能的时候&#xff0c;喷出一条火线&#xff0c;在火线上的的玩家都会受到伤害。犹豫在计算机上&#xff0c;直线的范围太小。如果我们只用直线来计算。很可能站在附近便宜一个像素的角色B就逃过的攻击。可以说&#xff0c;这种技能基本上攻击不了其他角色&#xff0c;除了特意攻击的那个。

下图中O为原点。怪物A&#xff0c;角色B/C/D三个&#xff0c;ABCD的绝对坐标都是知道的。手游卖号平台怪物A锁定B&#xff0c;向B喷火。&#xff08;图画得有点不好&#xff0c;大家不要介意&#xff09;。以喷火路线为相对坐标系的x轴。火线长为L&#xff0c;宽为W。一般来说&#xff0c;B是必然中招的&#xff08;这都不中招就是有bug了&#xff09;。相对坐标的x轴&#xff0c;就是向量AB的方向。Y轴垂直于向量AB

这个时候要判断C和D是否也被击中了。


我们先看C的相对坐标。AC是点的距离&#xff0c;再求角CAB就可以得到极坐标&#xff0c;然后用极坐标转换成直角坐标就可以了&#xff0c;

根据余弦定理  BC^2 &#61; AC^2 &#43; AB^2 - 2*AB*BC*cos(角CAB)。

所以cos&#xff08;角CAB&#xff09; &#61;  &#xff08;AC^2 &#43; AB^2 - BC^2&#xff09;/ 2*AB*BC

然后根据上面一提到的极坐标和直角坐标的转换。得出相对坐标xr &#61; AC * cos&#xff08;角CAB&#xff09;; yr ^2 &#61; AC ^2 &#43; yr ^ 2  ;

(xr,yr)就是相对坐标了。记得BC等于零的时候是不行的。&#xff08;都重合了还需要计算么&#xff1f;&#xff09;

再看看实现代码吧&#xff1a;
 

  1. class CPoint  
  2. {  
  3. public:  
  4.     double x;  
  5.     double y;  
  6. }  
  7. double computeDistance(CPoint from, CPoint to)  
  8. {  
  9.     return sqrt(pow(to.x - from.x, 2) &#43; pow(to.y - from.y, 2));  
  10. }  
  11. CPoint Common::changeAbsolute2Relative(CPoint originPoint, CPoint directionPoint, CPoint changePoint)  
  12. {  
  13.     CPoint rePoint;  
  14.     if (originPoint &#61;&#61; directionPoint)  
  15.     {  
  16.         rePoint.x &#61; changePoint.x - originPoint.x;  
  17.         rePoint.y &#61; changePoint.y - originPoint.y;  
  18.     }  
  19.     else  
  20.     {   
  21.         double a &#61; computeDistance(changePoint, originPoint);  
  22.         double b &#61; computeDistance(directionPoint, originPoint);  
  23.         double c &#61; computeDistance(directionPoint, changePoint);  
  24.         double cosa &#61; (b*b &#43; c*c - a*a) / 2 * b*c;//余弦定理  
  25.         rePoint.x &#61; a * cosa ;  
  26.         rePoint.y &#61; sqrt(a*a - rePoint.x*rePoint.x);  
  27.     }  
  28.     return rePoint;  
  1. }  


推荐阅读
author-avatar
常州秆时尚女人帮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有