b451f83174
Captures the pre-Godot-port state of the codebase. This is the rollback anchor for the Godot port (M0 of theriapolis-rpg-implementation-plan-godot-port.md). All Phase 0 through Phase 6.5 work is included; Phase 7 is in flight. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
44 lines
1.5 KiB
C#
44 lines
1.5 KiB
C#
namespace Theriapolis.Core.Util;
|
|
|
|
/// <summary>
|
|
/// Lightweight 2D float vector for world-pixel-space polyline coordinates.
|
|
/// Intentionally avoids System.Numerics to keep Core dependency-free.
|
|
/// </summary>
|
|
public readonly struct Vec2
|
|
{
|
|
public readonly float X;
|
|
public readonly float Y;
|
|
|
|
public Vec2(float x, float y) { X = x; Y = y; }
|
|
|
|
public static Vec2 operator +(Vec2 a, Vec2 b) => new(a.X + b.X, a.Y + b.Y);
|
|
public static Vec2 operator -(Vec2 a, Vec2 b) => new(a.X - b.X, a.Y - b.Y);
|
|
public static Vec2 operator *(Vec2 a, float s) => new(a.X * s, a.Y * s);
|
|
public static Vec2 operator *(float s, Vec2 a) => new(a.X * s, a.Y * s);
|
|
public static Vec2 operator /(Vec2 a, float s) => new(a.X / s, a.Y / s);
|
|
|
|
public float LengthSquared => X * X + Y * Y;
|
|
public float Length => MathF.Sqrt(LengthSquared);
|
|
|
|
public Vec2 Normalized
|
|
{
|
|
get
|
|
{
|
|
float len = Length;
|
|
return len < 1e-6f ? new Vec2(0, 0) : this * (1f / len);
|
|
}
|
|
}
|
|
|
|
/// <summary>90° CCW rotation — perpendicular vector.</summary>
|
|
public Vec2 Perp => new(-Y, X);
|
|
|
|
public static float Dot(Vec2 a, Vec2 b) => a.X * b.X + a.Y * b.Y;
|
|
public static float DistSq(Vec2 a, Vec2 b) => (a - b).LengthSquared;
|
|
public static float Dist(Vec2 a, Vec2 b) => (a - b).Length;
|
|
|
|
/// <summary>Linear interpolation between a and b at parameter t.</summary>
|
|
public static Vec2 Lerp(Vec2 a, Vec2 b, float t) => a + (b - a) * t;
|
|
|
|
public override string ToString() => $"({X:F1}, {Y:F1})";
|
|
}
|