|
0.前言
最近遇到一个需求,要计算出一个点绕另一个点旋转一定角度的路径。
虽然可以通过各种奇淫技巧达成这需求,但我还是想从数学的角度去处理这个问题。
这样一来,以后就可以通过调用我自己的数学库来完成相关问题的计算了。
1.分析问题
假设我们让(x,y)点绕(rx0,ry0)旋转a度,得到(x0,y0)。
我们最后要得到的点就是(x0,y0)。
规定旋转半径是r,最终点通过三角函数可以得到:
x0 = r * cos(a+b)
y0 = r * sin(a+b)
到这里其实半径和角度我们都可以通过计算求出来,但是我觉得还是麻烦,所以我们通过三角函数的和差角公式继续展开
二角和差公式
x0 = r * cosa coab - r * sina sinb
y0 = r * sina cosb + r * cosa sinb
这其中出现了可以化简的部分
r * sinb = y- ry0
r * cosb = x -rx0
所以最终我们得到公式
x0 = (x - rx0) * cosa - (y - ry0) * sina
y0 = (x - rx0) * sina + (y - ry0) * cosa
这里公式的未知量变成了最初的三个原始变量,两个点和一个旋转角度。
所以我们只需要输入这个三个两就会得到最总的结果。
2.代码实现
这里绕点旋转问题是在2D平面中进行的,所以参数和返回值都是Vector2,具体忽略哪个轴看情况分析。- public static Vector2 GetRotatePosition(Vector2 targetPosition, Vector2 centerPosition, float angele)
- {
- float endX = (targetPosition.x - centerPosition.x) * Mathf.Cos(angele * Mathf.Deg2Rad) -
- (targetPosition.y - centerPosition.y) * Mathf.Sin(angele * Mathf.Deg2Rad) + centerPosition.x;
- float endY = (targetPosition.y - centerPosition.y) * Mathf.Cos(angele * Mathf.Deg2Rad) +
- (targetPosition.x - targetPosition.x) * Mathf.Sin(angele * Mathf.Deg2Rad) + centerPosition.y;
- return new Vector2(endX, endY);
- }
复制代码 需要注意的是,数学库Mathf里的三角函数库的参数都是弧度值,跟我们以往使用三角函数时使用的角度值是有区别的,所以需要把角度转换为弧度值,使用 角度* Mathf.Deg2Rad 。
最后需要注意的是,逆时针旋转角度使用正角度,顺时针使用负角度。
3.总结
其实也没有什么的,就是用了三角函数的公式,最后把这个方法放到自己的工具库里使用就行了。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|