游戏中坐标转换
来源:互联网 发布:好用的隔离霜 知乎 编辑:程序博客网 时间:2024/05/18 20:07
本文来自肥宝传说之路,引用必须注明出处!
游戏里面经常用到坐标转换,例如地图、战斗技能等。
一、直角坐标和极坐标的转换
前提条件:
1、两坐标系原点重合
2、两坐标系x轴正半轴重合
3、两坐标系单位长度相同
变量关系:
如上图,M的直角坐标为(x,y),极坐标(ρ,Θ)。
由图中关系可以得出
ρ^2 = x^2 + y^2 (勾股定理)
tanΘ = y/x
x = ρ*cosΘ
y = ρ*sinΘ
其他象限的就不证明了,这里不是讲数学的。知道是一样就行了。
代码如下:
#include <math>//把直角坐标转换成极坐标void changeXYToPolarCoordinate(int x, int y, int& r, int& angle){if (x == 0){r = abs( y);//x轴为0,r等于y的绝对值if ( y < 0)//y小于0是270°{angle = 270;}else if ( y > 0)//y大于0是90°{angle = 90;}else//原点{angle = 0;}}else{r = sqrt( x* x + y* y); //与原点的距离angle = asin( y / r);<span style="white-space:pre"></span>//反正弦函数}}//把极坐标转换成直角坐标void changePolarCoordinateToXY(int& r, int& angle, int& x, int& y){ x = r * cos(angle); y = r * sin(angle);}
二、绝对坐标和相对坐标的转换
如图中坐标系O和坐标系A,原点分别是O(0,0),A(xa,ya).这个相对坐标系A的x轴和y轴是跟坐标系O的x轴和y轴分别平行的。
对于B(xb,yb)的相对坐标是(xb-xa,yb-ya)</p><p>就这么简单。
但是,如果A的坐标轴跟O的不平行呢?看下图
说一下运用的背景,例如怪物A身上有个喷火技能,释放技能的时候,喷出一条火线,在火线上的的玩家都会受到伤害。犹豫在计算机上,直线的范围太小。如果我们只用直线来计算。很可能站在附近便宜一个像素的角色B就逃过的攻击。可以说,这种技能基本上攻击不了其他角色,除了特意攻击的那个。
下图中O为原点。怪物A,角色B/C/D三个,ABCD的绝对坐标都是知道的。怪物A锁定B,向B喷火。(图画得有点不好,大家不要介意)。以喷火路线为相对坐标系的x轴。火线长为L,宽为W。一般来说,B是必然中招的(这都不中招就是有bug了)。相对坐标的x轴,就是向量AB的方向。Y轴垂直于向量AB
这个时候要判断C和D是否也被击中了。
我们先看C的相对坐标。AC是点的距离,再求角CAB就可以得到极坐标,然后用极坐标转换成直角坐标就可以了,
根据余弦定理 BC^2 = AC^2 + AB^2 - 2*AB*BC*cos(角CAB)。
所以cos(角CAB) = (AC^2 + AB^2 - BC^2)/ 2*AB*BC
然后根据上面一提到的极坐标和直角坐标的转换。得出相对坐标xr = AC * cos(角CAB); yr ^2 = AC ^2 + yr ^ 2 ;
(xr,yr)就是相对坐标了。记得BC等于零的时候是不行的。(都重合了还需要计算么?)
再看看实现代码吧:
</pre><pre code_snippet_id="1605923" snippet_file_name="blog_20160311_2_6232871" name="code" class="cpp">class CPoint{public: double x; double y;}double computeDistance(CPoint from, CPoint to){return sqrt(pow(to.x - from.x, 2) + pow(to.y - from.y, 2));}CPoint Common::changeAbsolute2Relative(CPoint originPoint, CPoint directionPoint, CPoint changePoint){CPoint rePoint;if (originPoint == directionPoint){rePoint.x = changePoint.x - originPoint.x;rePoint.y = changePoint.y - originPoint.y;}else{ double a = computeDistance(changePoint, originPoint);double b = computeDistance(directionPoint, originPoint);double c = computeDistance(directionPoint, changePoint);double cosa = (b*b + c*c - a*a) / 2 * b*c;//余弦定理rePoint.x = a * cosa ;rePoint.y = sqrt(a*a - rePoint.x*rePoint.x);}return rePoint;}
- 游戏中坐标转换
- 游戏中45度地图的坐标转换
- 游戏地图坐标与客户端坐标转换模型
- UIView中坐标的转换
- iOS UIView中坐标转换
- VC++中屏幕坐标与窗口坐标的转换
- Unity3D中世界坐标转换到NGUI坐标
- ArcEngine、C#中经纬度坐标、投影坐标之间的转换
- Unity3D中世界坐标转换到NGUI坐标
- Unity3D中世界坐标转换到NGUI世界坐标
- Unity3D中世界坐标转换到NGUI坐标
- Unity3D中世界坐标转换到NGUI坐标
- unity中世界坐标和绝对坐标之间的转换
- 打印中,设备坐标与逻辑坐标转换
- Unity3D中世界坐标转换到NGUI坐标
- ArcEngine、C#中经纬度坐标、投影坐标之间的转换
- AS3 RPG游戏引擎开发日志3:地图坐标转换
- RPG游戏引擎开发日志2:地图坐标转换
- 数据结构(2)线性表之顺序表
- HDOJ 1087 Super Jumping! Jumping! Jumping!
- ECshop Strict Standards: Only variables should be passed by reference in
- 66. Plus One
- 【bzoj2300】[HAOI2011]防线修建 凸包+set
- 游戏中坐标转换
- Regex
- Apache 整合Tomcat
- python的入门教程 资源
- Problem B: 使用指针访问数组元素--程序填空
- HDU1622 Trees on the level
- Hive命令行界面
- Test之guava
- android 定位的4种方式介绍