99 lines
2.5 KiB
C#
99 lines
2.5 KiB
C#
using UnityEngine;
|
|
|
|
namespace ARLocation
|
|
{
|
|
public static class MathUtils
|
|
{
|
|
public enum LineSegmentRegion
|
|
{
|
|
Start,
|
|
Middle,
|
|
End,
|
|
}
|
|
|
|
public class PointLineSegmentDistanceResult
|
|
{
|
|
public float Distance;
|
|
public LineSegmentRegion Region;
|
|
}
|
|
|
|
public static PointLineSegmentDistanceResult PointLineSegmentDistance(Vector2 point, Vector2 a, Vector2 b)
|
|
{
|
|
var result = new PointLineSegmentDistanceResult { };
|
|
|
|
var ap = point - a;
|
|
var ab = b - a;
|
|
var bp = point - b;
|
|
|
|
float proj = Vector3.Dot(ap, ab) / ab.magnitude;
|
|
float u = proj / ab.magnitude;
|
|
|
|
if (u < 0)
|
|
{
|
|
result.Distance = ap.magnitude;
|
|
result.Region = LineSegmentRegion.Start;
|
|
}
|
|
else if (u > 1)
|
|
{
|
|
result.Distance = bp.magnitude;
|
|
result.Region = LineSegmentRegion.End;
|
|
}
|
|
else
|
|
{
|
|
result.Distance = Mathf.Sqrt(ap.sqrMagnitude - proj * proj);
|
|
result.Region = LineSegmentRegion.Middle;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public static Vector2 HorizontalVector(Vector3 v)
|
|
{
|
|
return new Vector2(v.x, v.z);
|
|
}
|
|
|
|
public static Vector3 HorizontalVectorToVector3(Vector2 v, float y = 0.0f)
|
|
{
|
|
return new Vector3(v.x, y, v.y);
|
|
}
|
|
|
|
public static float HorizontalDistance(Vector3 a, Vector3 b)
|
|
{
|
|
return Vector2.Distance(HorizontalVector(a), HorizontalVector(b));
|
|
}
|
|
|
|
public static Vector3 SetY(Vector3 v, float y)
|
|
{
|
|
return new Vector3(v.x, y, v.z);
|
|
}
|
|
|
|
public static Vector3 SetXZ(Vector3 v, Vector3 w)
|
|
{
|
|
return new Vector3(w.x, v.y, w.z);
|
|
}
|
|
|
|
public static float DegreesToRadians(float degrees)
|
|
{
|
|
return Mathf.PI * degrees / 180.0f;
|
|
}
|
|
|
|
public static float RadiansToDegrees(float degrees)
|
|
{
|
|
return 180.0f * degrees / Mathf.PI;
|
|
}
|
|
|
|
public static class Double
|
|
{
|
|
public static double DegreesToRadians(double degrees)
|
|
{
|
|
return System.Math.PI * degrees / 180.0;
|
|
}
|
|
|
|
public static double RadiansToDegrees(double degrees)
|
|
{
|
|
return 180.0 * degrees / System.Math.PI;
|
|
}
|
|
}
|
|
}
|
|
}
|