Thunderbots Project
Loading...
Searching...
No Matches
vector.h
1#pragma once
2
3#include <cmath>
4#include <iostream>
5
6#include "software/geom/angle.h"
7
12{
13 public:
17 explicit Vector();
18
26 static Vector createFromAngle(const Angle &angle);
27
34 Vector(double x, double y);
35
41 Vector(const Vector &v);
42
48 double x() const;
49
55 double y() const;
56
63 void set(double x, double y);
64
70 void setX(double x);
71
77 void setY(double y);
78
84 double lengthSquared() const;
85
91 double length() const;
92
99 Vector normalize() const;
100
110 Vector normalize(double length) const;
111
118 Vector perpendicular() const;
119
127 Vector rotate(const Angle &rot) const;
128
136 Vector project(const Vector &other) const;
137
145 double dot(const Vector &other) const;
146
155 double cross(const Vector &other) const;
156
164 double determinant(const Vector &other) const;
165
183 Angle orientation() const;
184
192 Vector &operator=(const Vector &other);
193
201 bool isClockwiseOf(const Vector &other) const;
202
209 bool isCounterClockwiseOf(const Vector &other) const;
210
211 private:
216 double x_;
217
222 double y_;
223};
224
233Vector operator+(const Vector &p, const Vector &q) __attribute__((warn_unused_result));
234
243Vector &operator+=(Vector &u, const Vector &v);
244
252Vector operator-(const Vector &p) __attribute__((warn_unused_result));
253
262Vector operator-(const Vector &u, const Vector &v) __attribute__((warn_unused_result));
263
272Vector &operator-=(Vector &u, const Vector &v);
273
282Vector operator*(double s, const Vector &v) __attribute__((warn_unused_result));
283
292Vector operator*(const Vector &p, double s) __attribute__((warn_unused_result));
293
302Vector &operator*=(Vector &p, double s);
303
312Vector operator/(const Vector &p, double s) __attribute__((warn_unused_result));
313
322Vector &operator/=(Vector &p, double s);
323
332std::ostream &operator<<(std::ostream &os, const Vector &v);
333
342bool operator==(const Vector &u, const Vector &v);
343
352bool operator!=(const Vector &u, const Vector &v);
353
354// We need to define a hash function so that the Vector class can be used in unordered STL
355// containers
356// like unordered_set and unordered_map
357// https://prateekvjoshi.com/2014/06/05/using-hash-function-in-c-for-user-defined-classes/
358namespace std
359{
360 template <>
361 struct hash<Vector> final
362 {
363 size_t operator()(const Vector &v) const
364 {
365 hash<double> h;
366 return h(v.x()) * 17 + h(v.y());
367 }
368 };
369} // namespace std
Definition angle.h:15
Definition vector.h:12
double lengthSquared() const
Definition vector.cpp:42
bool isClockwiseOf(const Vector &other) const
Definition vector.cpp:177
Vector perpendicular() const
Definition vector.cpp:65
Vector()
Definition vector.cpp:10
void setY(double y)
Definition vector.cpp:37
double length() const
Definition vector.cpp:47
Vector normalize() const
Definition vector.cpp:52
double x() const
Definition vector.cpp:16
double determinant(const Vector &other) const
Definition vector.cpp:90
void setX(double x)
Definition vector.cpp:32
Vector rotate(const Angle &rot) const
Definition vector.cpp:70
bool isCounterClockwiseOf(const Vector &other) const
Definition vector.cpp:182
Vector project(const Vector &other) const
Definition vector.cpp:75
double y() const
Definition vector.cpp:21
Angle orientation() const
Definition vector.cpp:102
double cross(const Vector &other) const
Definition vector.cpp:85
static Vector createFromAngle(const Angle &angle)
Definition vector.cpp:5
void set(double x, double y)
Definition vector.cpp:26
double dot(const Vector &other) const
Definition vector.cpp:80
Vector & operator=(const Vector &other)
Definition vector.cpp:95