public static double Dot(KVector2 u, KVector2 v) { return(u.X * v.X + u.Y * v.Y); }
public static KVector2 Substract(KVector2 u, KVector2 v) { return(new KVector2(u.X - v.X, u.Y - v.Y)); }
public static KVector2 Multiply(KVector2 v, double k) { return(new KVector2(k * v.X, k * v.Y)); }
public static KVector2 operator /(KVector2 v, double k) { return(KVector2.Multiply(v, 1 / k)); }
public static KVector2 Add(KVector2 u, KVector2 v) { return(new KVector2(u.X + v.X, u.Y + v.Y)); }
public static double operator *(KVector2 u, KVector2 v) { return(KVector2.Dot(u, v)); }
public static KVector2 operator *(double k, KVector2 v) { return(KVector2.Multiply(k, v)); }
public static KVector2 operator %(KVector2 v, double z) { return(KVector2.Cross(v, z)); }
public static double operator %(KVector2 u, KVector2 v) { return(KVector2.Cross(u, v)); }
public static KVector2 operator -(KVector2 u) { return(KVector2.Multiply(-1, u)); }
public static KVector2 operator %(double z, KVector2 v) { return(KVector2.Cross(z, v)); }
public static KVector2 operator -(KVector2 u, KVector2 v) { return(KVector2.Substract(u, v)); }
public static KVector2 operator +(KVector2 u, KVector2 v) { return(KVector2.Add(u, v)); }
public static KVector2 Lerp(KVector2 a, KVector2 b, double alpha) { return(a + (b - a) * alpha); }
public static KVector2 TransformNormal(KVector2 v, KMatrix3x3Opti mat) { return(Normalize(TransformDir(v, mat))); }
public static KVector2 Normalize(KVector2 v) { return(v / v.Length()); }