constexpr Vector<Scalar> abs(Vector<Scalar> v) {
return Vector<Scalar>(std::abs(v.x), std::abs(v.y));
}
+template<class Scalar>
+inline Vector<Scalar> round(Vector<Scalar> v) {
+ return Vector<Scalar>(std::round(v.x), std::round(v.y));
+}
+template<>
+inline Vector<float> round(Vector<float> v) {
+ return Vector<float>(std::roundf(v.x), std::roundf(v.y));
+}
+template<class Scalar>
+constexpr Vector<Scalar> min(Vector<Scalar> lhs, Vector<Scalar> rhs) {
+ return Vector<Scalar>(std::min(lhs.x, rhs.x), std::min(lhs.y, rhs.y));
+}
+template<class Scalar>
+constexpr Vector<Scalar> max(Vector<Scalar> lhs, Vector<Scalar> rhs) {
+ return Vector<Scalar>(std::max(lhs.x, rhs.x), std::max(lhs.y, rhs.y));
+}
template<class Scalar>
return v / Length(v);
}
+template<class Scalar>
+constexpr Vector<Scalar> MirrorX(Vector<Scalar> v) {
+ return Vector<Scalar>(v.x, -v.y);
+}
+template<class Scalar>
+constexpr Vector<Scalar> MirrorY(Vector<Scalar> v) {
+ return Vector<Scalar>(-v.x, v.y);
+}
+
template<class Scalar>
constexpr Vector<Scalar> Rotate90(Vector<Scalar> v) {
return Vector<Scalar>(-v.y, v.x);
constexpr Vector<Scalar> Rotate270(Vector<Scalar> v) {
return Vector<Scalar>(v.y, -v.x);
}
+// angle given in radians
template<class Scalar, class Float>
inline Vector<Scalar> Rotate(Vector<Scalar> v, Float by) {
Float sine(std::sin(by));