PathfindingSystem.Distance.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using System.Numerics;
  2. using Content.Shared.NPC;
  3. namespace Content.Server.NPC.Pathfinding;
  4. public sealed partial class PathfindingSystem
  5. {
  6. public float EuclideanDistance(PathPoly start, PathPoly end)
  7. {
  8. var (dx, dy) = GetDiff(start, end);
  9. return MathF.Sqrt((dx * dx + dy * dy));
  10. }
  11. public float ManhattanDistance(PathPoly start, PathPoly end)
  12. {
  13. var (dx, dy) = GetDiff(start, end);
  14. return dx + dy;
  15. }
  16. public float OctileDistance(PathPoly start, PathPoly end)
  17. {
  18. var (dx, dy) = GetDiff(start, end);
  19. return dx + dy + (1.41f - 2) * Math.Min(dx, dy);
  20. }
  21. private Vector2 GetDiff(PathPoly start, PathPoly end)
  22. {
  23. var startPos = start.Box.Center;
  24. var endPos = end.Box.Center;
  25. if (end.GraphUid != start.GraphUid)
  26. {
  27. if (!TryComp(start.GraphUid, out TransformComponent? startXform) ||
  28. !TryComp(end.GraphUid, out TransformComponent? endXform))
  29. {
  30. return Vector2.Zero;
  31. }
  32. endPos = Vector2.Transform(Vector2.Transform(endPos, _transform.GetWorldMatrix(endXform)), _transform.GetInvWorldMatrix(startXform));
  33. }
  34. // TODO: Numerics when we changeover.
  35. var diff = startPos - endPos;
  36. var ab = Vector2.Abs(diff);
  37. return ab;
  38. }
  39. }