Arcade-Maniac/Source/Assets/Misc/Scripts/Extensions/GetPointAlongExtension.cs

65 lines
2.0 KiB
C#

using System;
using UnityEngine;
namespace That_One_Nerd.Unity.Games.ArcadeManiac.Misc.Extensions
{
public static class GetPointAlongExtension
{
public static Vector2 GetPointAlong(this Rect r, float percent)
{
percent %= 1;
Vector2 percentOfWhole = GetPercentOfWhole();
Vector2[] keyVerts = GetKeyVerts();
bool secondQuarter = percent > percentOfWhole.x;
Vector2[] keyLine = GetKeyLine();
if (secondQuarter) percent -= percentOfWhole.x;
percent /= secondQuarter ? percentOfWhole.y : percentOfWhole.x;
return Vector2.Lerp(keyLine[0], keyLine[1], percent);
Vector2[] GetKeyVerts()
{
Vector2[] verts = new Vector2[4]
{
new Vector2(r.min.x, r.min.y),
new Vector2(r.max.x, r.min.y),
new Vector2(r.max.x, r.max.y),
new Vector2(r.min.x, r.max.y)
};
bool secondHalf = percent > 0.5f;
if (secondHalf)
{
percent -= 0.5f;
percentOfWhole = new Vector2(percentOfWhole.y, percentOfWhole.x);
}
return new Vector2[3]
{
verts[0],
verts[Convert.ToInt32(secondHalf) * 2 + 1],
verts[2]
};
}
Vector2 GetPercentOfWhole()
{
Vector2 lengths = new Vector2(Mathf.Abs(r.max.x - r.min.x), Mathf.Abs(r.max.y - r.min.y));
float lineLength = lengths.x * 2 + lengths.y * 2;
return new Vector2(lengths.x / lineLength, lengths.y / lineLength);
}
Vector2[] GetKeyLine()
{
int index = Convert.ToInt32(secondQuarter);
return new Vector2[2]
{
keyVerts[index],
keyVerts[index + 1]
};
}
}
}
}