- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public struct Line
- {
- private const float verticalLineGradient = 1e5f;
- private float gradient;
- private float yIntercept;
- private float gradientPerpendicular;
- private Vector2 pointOnLine1;
- private Vector2 pointOnLine2;
- private bool approachSide;
- public Line(Vector2 pointOnLine, Vector2 pointPerpendicularToLine)
- {
- float dx = pointOnLine.x - pointPerpendicularToLine.x;
- float dy = pointOnLine.y - pointPerpendicularToLine.y;
- if (dx == 0)
- gradientPerpendicular = verticalLineGradient;
- else
- gradientPerpendicular = dy / dx;
- if(gradientPerpendicular == 0)
- gradient = verticalLineGradient;
- else
- gradient = -1 / gradientPerpendicular;
- yIntercept = pointOnLine.y - gradient * pointOnLine.x;
- pointOnLine1 = pointOnLine;
- pointOnLine2 = pointOnLine + new Vector2(1, gradient);
- approachSide = false;
- approachSide = GetSide(pointPerpendicularToLine);
- }
- private bool GetSide(Vector2 p) => (p.x - pointOnLine1.x) * (pointOnLine2.y - pointOnLine1.y)
- > (p.y - pointOnLine1.y) * (pointOnLine2.x - pointOnLine1.x);
- public bool HasCrossedLine(Vector2 p) => GetSide(p) != approachSide;
- public float DistanceFromPoint(Vector2 point)
- {
- float yInterceptPerpendicular = point.y - gradientPerpendicular * point.x;
- float intercectX = (yInterceptPerpendicular - yIntercept) / (gradient - gradientPerpendicular);
- float intercectY = gradient * intercectX + yIntercept;
- return Vector2.Distance(point, new Vector2(intercectX, intercectY));
- }
- public void DrawWithGizmos(float lenght)
- {
- Vector2 lineDir = new Vector2(1, gradient).normalized;
- Vector2 lineCenter = new Vector2(pointOnLine1.x, pointOnLine1.y) + Vector2.up;
- Gizmos.DrawLine(lineCenter - lineDir * lenght/2, lineCenter + lineDir * lenght/2);
- }
- }