TZFX.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. namespace SimulationCommon;
  2. public class TZFX
  3. {
  4. public static double CalculateVectorAngle(double[] vector)
  5. {
  6. double vectorCos = vector[0] / Math.Sqrt(vector[0] * vector[0] + vector[1] * vector[1]);
  7. double vectorAngle = 0;
  8. if (vector[1] >= 0)
  9. {
  10. vectorAngle = Math.Acos(vectorCos);
  11. }
  12. else if (vector[1] < 0)
  13. {
  14. vectorAngle = 2 * Math.PI - Math.Acos(vectorCos);
  15. }
  16. return vectorAngle;
  17. }
  18. public static Point MovePointByVandA(double angle, double distance, Point startPoint, double[] vector)
  19. {
  20. Point finalPoint = new Point();
  21. double vectorAngle = CalculateVectorAngle(vector);
  22. vectorAngle += angle;
  23. double vectorAngleSin = Math.Sin(vectorAngle);
  24. double vectorAngleCos = Math.Cos(vectorAngle);
  25. finalPoint.lon = startPoint.lon + distance * vectorAngleCos;
  26. finalPoint.lat = startPoint.lat + distance * vectorAngleSin;
  27. return finalPoint;
  28. }
  29. public static List<Point> GenerateWaypoints(Point rv0, Point rv1, Point rv2, Point rv3, double a, double sweepWidth)
  30. {
  31. List<Point> outputWaypoints = new List<Point>();
  32. double[] leftdir = { rv0.lon - rv1.lon, rv0.lat - rv1.lat };
  33. double[] updir = { rv1.lon - rv2.lon, rv1.lat - rv2.lat };
  34. Point CP1 = MovePointByVandA(0, a / 2, rv1, leftdir);
  35. Point CP = MovePointByVandA(Math.PI, a / 2, CP1, updir);
  36. outputWaypoints.Add(CP);
  37. double forwardDistance = 0;
  38. Point midWaypoint = new Point { lat = CP.lat, lon = CP.lon };
  39. for (int i = 1; forwardDistance < a/2; i++)
  40. {
  41. Point MovePoint1 = MovePointByVandA(0, i * sweepWidth, midWaypoint, leftdir);
  42. outputWaypoints.Add(MovePoint1);
  43. midWaypoint.lon = MovePoint1.lon;
  44. midWaypoint.lat = MovePoint1.lat;
  45. Point MovePoint2 = MovePointByVandA(0, i * sweepWidth, midWaypoint, updir);
  46. outputWaypoints.Add(MovePoint2);
  47. midWaypoint.lon = MovePoint2.lon;
  48. midWaypoint.lat = MovePoint2.lat;
  49. forwardDistance += sweepWidth;
  50. i++;
  51. Point MovePoint3 = MovePointByVandA(Math.PI, i * sweepWidth, midWaypoint, leftdir);
  52. outputWaypoints.Add(MovePoint3);
  53. midWaypoint.lon = MovePoint3.lon;
  54. midWaypoint.lat = MovePoint3.lat;
  55. Point MovePoint4 = MovePointByVandA(Math.PI, i * sweepWidth, midWaypoint, updir);
  56. outputWaypoints.Add(MovePoint4);
  57. midWaypoint.lon = MovePoint4.lon;
  58. midWaypoint.lat = MovePoint4.lat;
  59. }
  60. return outputWaypoints;
  61. }
  62. }