This repository has been archived on 2025-04-28. You can view files and clone it, but cannot push or open issues or pull requests.
ARPlusSystem/ARPlusSystem-250418/Assets/ARLocation/Scripts/Math/MathUtils.cs

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;
}
}
}
}