Newer
Older
TheVengeance-Project-IADE-Unity2D / Assets / Scripts / NPC / Pathfinding / Line.cs
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public struct Line
  5. {
  6. private const float verticalLineGradient = 1e5f;
  7. private float gradient;
  8. private float yIntercept;
  9. private float gradientPerpendicular;
  10. private Vector2 pointOnLine1;
  11. private Vector2 pointOnLine2;
  12. private bool approachSide;
  13. public Line(Vector2 pointOnLine, Vector2 pointPerpendicularToLine)
  14. {
  15. float dx = pointOnLine.x - pointPerpendicularToLine.x;
  16. float dy = pointOnLine.y - pointPerpendicularToLine.y;
  17. if (dx == 0)
  18. gradientPerpendicular = verticalLineGradient;
  19. else
  20. gradientPerpendicular = dy / dx;
  21. if(gradientPerpendicular == 0)
  22. gradient = verticalLineGradient;
  23. else
  24. gradient = -1 / gradientPerpendicular;
  25. yIntercept = pointOnLine.y - gradient * pointOnLine.x;
  26. pointOnLine1 = pointOnLine;
  27. pointOnLine2 = pointOnLine + new Vector2(1, gradient);
  28. approachSide = false;
  29. approachSide = GetSide(pointPerpendicularToLine);
  30. }
  31. private bool GetSide(Vector2 p) => (p.x - pointOnLine1.x) * (pointOnLine2.y - pointOnLine1.y)
  32. > (p.y - pointOnLine1.y) * (pointOnLine2.x - pointOnLine1.x);
  33. public bool HasCrossedLine(Vector2 p) => GetSide(p) != approachSide;
  34. public float DistanceFromPoint(Vector2 point)
  35. {
  36. float yInterceptPerpendicular = point.y - gradientPerpendicular * point.x;
  37. float intercectX = (yInterceptPerpendicular - yIntercept) / (gradient - gradientPerpendicular);
  38. float intercectY = gradient * intercectX + yIntercept;
  39. return Vector2.Distance(point, new Vector2(intercectX, intercectY));
  40. }
  41. public void DrawWithGizmos(float lenght)
  42. {
  43. Vector2 lineDir = new Vector2(1, gradient).normalized;
  44. Vector2 lineCenter = new Vector2(pointOnLine1.x, pointOnLine1.y) + Vector2.up;
  45. Gizmos.DrawLine(lineCenter - lineDir * lenght/2, lineCenter + lineDir * lenght/2);
  46. }
  47. }