using System; namespace Syntriax.Engine.Physics2D.Primitives; public record Vector2D(float X, float Y) { public readonly static Vector2D Up = new(0f, 1f); public readonly static Vector2D Down = new(0f, -1f); public readonly static Vector2D Left = new(-1f, 0f); public readonly static Vector2D Right = new(1f, 0f); public readonly static Vector2D One = new(1f, 1f); public static Vector2D operator +(Vector2D left, Vector2D right) => new(left.X + right.X, left.Y + right.Y); public static Vector2D operator -(Vector2D left, Vector2D right) => new(left.X - right.X, left.Y - right.Y); public static Vector2D operator *(Vector2D vector, float value) => new(vector.X * value, vector.Y * value); public static Vector2D operator /(Vector2D vector, float value) => new(vector.X / value, vector.Y / value); public static float Length(Vector2D vector) => MathF.Sqrt(LengthSquared(vector)); public static float LengthSquared(Vector2D vector) => vector.X * vector.X + vector.Y * vector.Y; public static float Distance(Vector2D from, Vector2D to) => Length(FromTo(from, to)); public static Vector2D Normalize(Vector2D vector) => vector / Length(vector); public static Vector2D FromTo(Vector2D from, Vector2D to) => to - from; public static Vector2D Scale(Vector2D vector, Vector2D scale) => new(vector.X * scale.X, vector.Y * scale.Y); public static float Cross(Vector2D left, Vector2D right) => left.X * right.Y - left.Y * right.X; 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; }