问题: 求直角坐标与极坐标,球坐标的转换关系

直角坐标与极坐标关系示意图

直角坐标与球坐标关系示意图
问题分析: 坐标之间的关系上图已经表示的非常清楚了,通过简单的三角函数就能够推导,。这里只是记录一下,方便需要的时候直接套用。
直角坐标转极坐标:
极坐标转直角坐标:
直角坐标转球坐标:
球坐标转直角坐标:
注意点: arctan的取值范围是[-π/2,π/2],在实际应用中需要做象限的判断。
- 当 (x, y) 在第一象限, 0 < θ < π/2.
- 当 (x, y) 在第二象限 π/2 < θ≤π.
- 当 (x, y) 在第三象限, -π< θ < -π/2.
- 当 (x, y) 在第四象限, -π/2 < θ < 0.
Unity代码:这里只记录直角与极坐标的转换,核心还是上面的公式和注意事项,球坐标或者其他语言的实现套用就可以了。
/// <summary>
/// 极坐标到直角坐标
/// </summary>
/// <param name="polar">输入的极坐标</param>
public Vector2 Polar2Orthogonal(Vector2 polar)
{
/*
* polar.x 极坐标的偏移距离
* polar.y 极坐标的偏移弧度
*/
Vector2 orthogonal =Vector2.zero;
orthogonal.x = polar.x * Mathf.Cos(polar.y);
orthogonal.y= polar.x * Mathf.Sin(polar.y);
return orthogonal;
}
/// <summary>
/// 直角坐标到极坐标
/// </summary>
/// <param name="orthogonal">输入的直角坐标</param>
public Vector2 Orthogonal2Polar(Vector2 orthogonal)
{
/*
* polar.x 极坐标的偏移距离
* polar.y 极坐标的偏移弧度
*/
Vector2 polar = Vector2.zero;
polar.x = Mathf.Sqrt(orthogonal.x * orthogonal.x + orthogonal.y * orthogonal.y);
polar.y = Mathf.Atan(orthogonal.y / orthogonal.x);
//象限判断
if(orthogonal.x>0&& orthogonal.y<0)
{
polar.y = Mathf.PI - Mathf.Abs(polar.y);
}
else if(orthogonal.x<0&& orthogonal.y<0)
{
polar.y = Mathf.PI + Mathf.Abs(polar.y);
}
else if(orthogonal.x<0&& orthogonal.y>0)
{
polar.y = 2*Mathf.PI - Mathf.Abs(polar.y);
}
return polar;
}
应用场景:

怪物的视角.gif