#pragma once #define _USE_MATH_DEFINES #include template struct vec2 { T x; T y; }; using vec2d = vec2; inline vec2d direction(double degrees) { double radians = degrees * M_PI / 180; return { cos(radians), sin(radians) }; } constexpr vec2d rotate(const vec2d& v, const vec2d& direction) { return { v.x * direction.x - v.y * direction.y, v.x * direction.y + v.y * direction.x }; } inline double magnitude(const vec2d& v) { return sqrt(v.x * v.x + v.y * v.y); } inline double lp_distance(const vec2d& v, double p) { return pow(pow(v.x, p) + pow(v.y, p), 1 / p); }