using UnityEngine; using System.Collections; public class LMath { public static float frac(float value){ return value - (float)Mathf.FloorToInt(value); } } public class SphericalCoordinate { private float polar; private float elevation; private Vector3 cartesian; public float PolarAngle{ get{ return polar; } set{ polar = value; UpdateCartesian(); } } public float ElevationAngle{ get{ return elevation; } set{ elevation = value; UpdateCartesian(); } } public Vector3 Cartesian{ get{ return cartesian; } set { UpdateSpherical(value); } } public SphericalCoordinate(){ UpdateCartesian(); } private void UpdateCartesian(){ float a = Mathf.Cos(elevation); cartesian.x = a * Mathf.Cos(polar); cartesian.y = Mathf.Sin(elevation); cartesian.z = a * Mathf.Sin(polar); } private void UpdateSpherical(Vector3 cartesianCoord){ if (cartesianCoord.x == 0.0f) cartesianCoord.x = Mathf.Epsilon; float radius = Mathf.Sqrt((cartesianCoord.x * cartesianCoord.x) + (cartesianCoord.y * cartesianCoord.y) + (cartesianCoord.z * cartesianCoord.z)); polar = Mathf.Atan(cartesianCoord.z / cartesianCoord.x); if (cartesianCoord.x < 0.0f) polar += Mathf.PI; elevation = Mathf.Asin(cartesianCoord.y / radius); } }