Advertisement
MyOnAsSalat

Untitled

Jan 27th, 2018
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.23 KB | None | 0 0
  1.  
  2. using UnityEngine;
  3.  
  4. public static class MathS
  5. {
  6.     public static Vector3 CartToSpher(Vector3 cartesianCoordinates)
  7.     {
  8.         float x = cartesianCoordinates.x;
  9.         float y = cartesianCoordinates.y;
  10.         float z = cartesianCoordinates.z;
  11.         float r = Mathf.Sqrt(x * x + y * y + z * z);
  12.         float theta = Mathf.Asin(y / r);
  13.         float phi = Mathf.Atan2(z, x);
  14.         return new Vector3(r, theta, phi < 0 ? Mathf.PI * 2 - Mathf.Abs(phi) : phi);
  15.     }
  16.     public static Vector3 SpherToCart(Vector3 sphericalCoordinates)
  17.     {
  18.         float r = sphericalCoordinates.x;
  19.         float theta = sphericalCoordinates.y;
  20.         float phi = sphericalCoordinates.z;
  21.         float x = r * Mathf.Cos(theta) * Mathf.Cos(phi);
  22.         float z = r * Mathf.Cos(theta) * Mathf.Sin(phi);
  23.         float y = r * Mathf.Sin(theta);
  24.         return new Vector3(x, y, z);
  25.     }
  26.  
  27.     public static float ArcLengthRad(PointC p1, PointC p2)
  28.     {
  29.         return Mathf.Acos(Mathf.Sin(p1.PhiRad) * Mathf.Sin(p2.PhiRad) +  Mathf.Cos(p1.PhiRad) * Mathf.Cos(p2.PhiRad) * Mathf.Cos(p1.ThetaRad - p2.ThetaRad));
  30.     }
  31.  
  32.     public static float ArcLength(PointC p1, PointC p2)
  33.     {
  34.         return ArcLengthRad(p1, p2) * p1.R;
  35.     }
  36.  
  37.     public static float AngleByPoint(PointC p1, PointC vertex, PointC p2)
  38.     {
  39.         float a = ArcLengthRad(vertex, p1);
  40.         float b = ArcLengthRad(vertex, p2);
  41.         float c = ArcLengthRad(p1, p2);
  42.         return  Mathf.Acos((Mathf.Cos(b) - Mathf.Cos(c) * Mathf.Cos(a)) / (Mathf.Sin(c) * Mathf.Sin(a)));
  43.     }
  44.     public static float TriangleExcess(PointC p1, PointC p2, PointC p3)
  45.     {
  46.         float A = AngleByPoint(p1, p2, p3);
  47.         float B = AngleByPoint(p3, p1, p2);
  48.         float C = AngleByPoint(p2, p3, p1);
  49.         return A + B + C - Mathf.PI;
  50.     }
  51.     public static float TriangleArea(PointC p1, PointC p2, PointC p3)
  52.     {
  53.         return TriangleExcess(p1, p2, p3) * p1.R;
  54.     }
  55.  
  56. }
  57. public enum InputType
  58. {
  59.     Degrees,
  60.     Radians,
  61.     Cartesian
  62. }
  63. public class PointC
  64. {
  65.     public readonly float R;
  66.     public readonly float ThetaRad;
  67.     public readonly float PhiRad;
  68.     public float ThetaDeg {get { return ThetaRad * Mathf.Rad2Deg; }}
  69.     public float PhiDeg   {get { return PhiRad * Mathf.Rad2Deg; }}
  70.     public readonly Vector3 point;
  71.     public PointC(Vector3 p,InputType type)
  72.     {
  73.         switch (type)
  74.         {
  75.             case InputType.Radians:
  76.                 R = p.x;
  77.                 ThetaRad = p.y;
  78.                 PhiRad = p.z;
  79.                 point = MathS.SpherToCart(p);
  80.                 break;
  81.             case InputType.Degrees:
  82.                 R = p.x;
  83.                 ThetaRad = p.y * Mathf.Deg2Rad;
  84.                 PhiRad = p.z * Mathf.Deg2Rad;
  85.                 point = MathS.SpherToCart(new Vector3(p.x,ThetaRad,PhiRad));
  86.                 break;
  87.             case InputType.Cartesian:
  88.                 Vector3 rad = MathS.CartToSpher(p);
  89.                 R = rad.x;
  90.                 ThetaRad = rad.y;
  91.                 PhiRad = rad.z;
  92.                 point = p;
  93.                 break;
  94.         }
  95.     }
  96.     public PointC(PointC p)
  97.     {
  98.         R = p.R;
  99.         ThetaRad = p.ThetaRad;
  100.         PhiRad = p.PhiRad;
  101.         point = p.point;
  102.     }
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement