feat: Vector2D.Orientation
This commit is contained in:
parent
77e1949f59
commit
0c3bf48d2c
|
@ -49,6 +49,23 @@ public record Vector2D(float X, float Y)
|
||||||
public static float Angle(Vector2D left, Vector2D right) => MathF.Acos(Dot(left, right) / (Length(left) * Length(right)));
|
public static float Angle(Vector2D left, Vector2D right) => MathF.Acos(Dot(left, right) / (Length(left) * Length(right)));
|
||||||
public static float Dot(Vector2D left, Vector2D right) => left.X * right.X + left.Y * right.Y;
|
public static float Dot(Vector2D left, Vector2D right) => left.X * right.X + left.Y * right.Y;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Finds the Orientation of 3 <see cref="Vector2D"/>s
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>0 -> Collinear, 1 -> Clockwise, 2 -> Counterclockwise</returns>
|
||||||
|
public static int Orientation(Vector2D left, Vector2D middle, Vector2D right)
|
||||||
|
{
|
||||||
|
Vector2D leftToMiddle = left.FromTo(middle);
|
||||||
|
Vector2D middleToRight = middle.FromTo(right);
|
||||||
|
|
||||||
|
float value = leftToMiddle.Y * middleToRight.X -
|
||||||
|
leftToMiddle.X * middleToRight.Y;
|
||||||
|
|
||||||
|
if (value > 0) return 1;
|
||||||
|
if (value < 0) return 2;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
public static bool ApproximatelyEquals(Vector2D left, Vector2D right, float epsilon = float.Epsilon)
|
public static bool ApproximatelyEquals(Vector2D left, Vector2D right, float epsilon = float.Epsilon)
|
||||||
=> left.X.ApproximatelyEquals(right.X, epsilon) && left.Y.ApproximatelyEquals(right.Y, epsilon);
|
=> left.X.ApproximatelyEquals(right.X, epsilon) && left.Y.ApproximatelyEquals(right.Y, epsilon);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue