Utility.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using Unity.Mathematics;
  2. public static class Utility
  3. {
  4. #region 距离面积坐标转换
  5. /********** 地球半径数据计算 ***************/
  6. /// <summary>
  7. /// 地球半径 m
  8. /// </summary>
  9. private const double EarthRadius = 6371393;
  10. /// <summary>
  11. /// 获取距离
  12. /// </summary>
  13. /// <param name="startPos">起点经纬度</param>
  14. /// <param name="endPos">终点经纬度</param>
  15. /// <returns></returns>
  16. public static double GetDiatance(double3 startPos, double3 endPos)
  17. {
  18. double xA = math.cos(Rad(startPos.y)) * math.cos(Rad(startPos.x));
  19. double yA = math.cos(Rad(startPos.y)) * math.sin(Rad(startPos.x));
  20. double zA = math.sin(Rad(startPos.y));
  21. double xB = math.cos(Rad(endPos.y)) * math.cos(Rad(endPos.x));
  22. double yB = math.cos(Rad(endPos.y)) * math.sin(Rad(endPos.x));
  23. double zB = math.sin(Rad(endPos.y));
  24. double angleL = (xA * xB + yA * yB + zA * zB) / math.sqrt((xA * xA + yA * yA + zA * zA) * (xB * xB + yB * yB + zB * zB));
  25. double distance = EarthRadius * math.acos(angleL);
  26. return distance;
  27. }
  28. /// <summary>
  29. /// 经纬度转化成弧度
  30. /// </summary>
  31. /// <param name="d"></param>
  32. /// <returns></returns>
  33. private static double Rad(double d)
  34. {
  35. return d * Math.PI / 180d;
  36. }
  37. #region 计算面积
  38. /// <summary>
  39. /// 计算面积
  40. /// </summary>
  41. /// <param name="points"></param>
  42. /// <returns></returns>
  43. public static double GetArea(List<double3> points)
  44. {
  45. double result = 0;
  46. for (int i = 0; i < points.Count - 2; i++)
  47. {
  48. int j = i + 1;
  49. int K = i + 2;
  50. double totalAngle = GetAngle(points[i], points[j], points[K]);
  51. double dis1 = GetDiatance(points[i], points[j]);
  52. double dis2 = GetDiatance(points[j], points[K]);
  53. result += dis1 * dis2 * Math.Abs(math.sin(Rad(totalAngle)));
  54. }
  55. return result;
  56. }
  57. /// <summary>
  58. /// 计算 3个点的角度
  59. /// </summary>
  60. /// <param name="start"></param>
  61. /// <param name="end"></param>
  62. /// <returns></returns>
  63. private static double GetAngle(double3 A, double3 B, double3 C)
  64. {
  65. double bearing1 = GetBearing(B, A);
  66. double bearing2 = GetBearing(B, C);
  67. double angle = bearing2 - bearing1;
  68. if (angle < 0)
  69. {
  70. angle += 360;
  71. }
  72. return angle;
  73. }
  74. /// <summary>
  75. /// 计算 从A点到B点相对于平面 X 轴的平面角度
  76. /// </summary>
  77. /// <param name="A"></param>
  78. /// <param name="B"></param>
  79. /// <returns></returns>
  80. private static double GetBearing(double3 A, double3 B)
  81. {
  82. double lat1 = Rad(A.y);
  83. double lon1 = Rad(A.x);
  84. double lat2 = Rad(B.y);
  85. double lon2 = Rad(B.x);
  86. double angle = -Math.Atan2(Math.Sin(lon1 - lon2) * Math.Cos(lat2), Math.Cos(lat1) * Math.Sin(lat2) - Math.Sin(lat1) * Math.Cos(lat2) * Math.Cos(lon1 - lon2));
  87. if (angle < 0)
  88. {
  89. angle += 2 * Math.PI;
  90. }
  91. return angle * 180d / Math.PI;
  92. }
  93. #endregion
  94. #endregion
  95. }