geometry.cpp
1 #include <cmath>
2 #include "../misc/utils.hpp"
3 #include "geometry.hpp"
4 
5 using namespace std;
6 
7 Vector2D Rotate(Vector2D const& v, double a)
8 {
9  return Vector2D(v.x*cos(a)-v.y*sin(a),
10  v.x*sin(a)+v.y*cos(a));
11 }
12 
13 double Vector2D::distance(Vector2D const& v1) const
14 {
15  return sqrt((x-v1.x)*(x-v1.x)
16  +(y-v1.y)*(y-v1.y));
17 }
18 
19 double abs(Vector2D const& v)
20 {
21  return sqrt(v.x*v.x+v.y*v.y);
22 }
23 
24 double fastabs(Vector2D const& v)
25 {
26  return fastsqrt(v.x*v.x + v.y*v.y);
27 }
28 
29 
31  x(0), y(0) {}
32 
33 Vector2D::Vector2D(double ix, double iy):
34  x(ix), y(iy) {}
35 
37  x(v.x), y(v.y) {}
38 
39 void Vector2D::Set(double ix, double iy)
40 {
41  x = ix;
42  y = iy;
43 }
44 
46 {
47  if (this == &v)
48  return *this;
49  x=v.x;
50  y=v.y;
51  return *this;
52 }
53 
55 {
56  x*=s;
57  y*=s;
58  return *this;
59 }
60 
62 {
63  x += v.x;
64  y += v.y;
65  return *this;
66 }
67 
69 {
70  x -= v.x;
71  y -= v.y;
72  return *this;
73 }
74 
75 void Vector2D::Rotate(double a)
76 {
77  x = x*cos(a)-y*sin(a);
78  y = x*sin(a)+y*cos(a);
79 }
80 
81 Vector2D operator+(Vector2D const& v1, Vector2D const& v2)
82 {
83  return Vector2D(v1.x+v2.x,v1.y+v2.y);
84 }
85 
87  Vector2D const& v2)
88 {
89  return Vector2D(v1.x-v2.x,v1.y-v2.y);
90 }
91 
92 Vector2D operator*(double d, Vector2D const& v)
93 {
94  return Vector2D(v.x*d,v.y*d);
95 }
96 
97 Vector2D operator*(Vector2D const& v, double d)
98 {
99  return d*v;
100 }
101 
102 Vector2D operator/(Vector2D const& v, double d)
103 {
104  return Vector2D(v.x/d, v.y/d);
105 }
106 
107 double ScalarProd(Vector2D const& v1,
108  Vector2D const& v2)
109 {
110  return v1.x*v2.x +
111  v1.y*v2.y;
112 }
113 
114 double Projection(Vector2D const& v1, Vector2D const& v2)
115 {
116  return ScalarProd(v1, v2)/abs(v2);
117 }
118 
119 double CalcAngle(Vector2D const& v1, Vector2D const& v2)
120 {
121  return acos(ScalarProd(v1, v2)/abs(v1)/abs(v2));
122 }
123 
124 Vector2D Reflect(Vector2D const& v, Vector2D const& axis)
125 {
126  return 2*ScalarProd(v, axis)*axis/pow(abs(axis),2)-v;
127 }
128 
129 double distance(Vector2D const& v1, Vector2D const& v2)
130 {
131  return abs(v1-v2);
132 }
133 
134 double CrossProduct(Vector2D const& v1, Vector2D const& v2)
135 {
136  return v1.x*v2.y-
137  v1.y*v2.x;
138 }
139 
141 {
142  return Vector2D((v1.x+v2.x)*0.5, (v1.y+v2.y)*0.5);
143 }
144 
146 {
147  return Vector2D(v.y,-v.x);
148 }
149 
150 Vector2D pol2cart(double radius,
151  double angle)
152 {
153  return Vector2D(radius*cos(angle),
154  radius*sin(angle));
155 }
156 
157 
159 {
160  return v/abs(v);
161 }
162 
163 double dist_sqr(const Vector2D& v)
164 {
165  return ScalarProd(v,v);
166 }
167 
168 #ifdef RICH_MPI
169 size_t Vector2D::getChunkSize(void) const
170 {
171  return 2;
172 }
173 
174 vector<double> Vector2D::serialize(void) const
175 {
176  vector<double> res(2,0);
177  res.at(0) = x;
178  res.at(1) = y;
179  return res;
180 }
181 
183 (const vector<double>& data)
184 {
185  assert(data.size()==getChunkSize());
186  x = data.at(0);
187  y = data.at(1);
188 }
189 #endif // RICH_MPI
double distance(Vector2D const &v1) const
Caluclates the distance from the Vector to v1.
Definition: geometry.cpp:13
Geometrical calculations.
size_t getChunkSize(void) const
Returns the size of array needed to store all data.
Definition: geometry.cpp:169
Vector3D CrossProduct(Vector3D const &v1, Vector3D const &v2)
Returns the cross product of two vectors.
Definition: Vector3D.cpp:213
void Rotate(double a)
Rotates the vector in an anticlockwise direction.
Definition: geometry.cpp:75
Vector3D Reflect(Vector3D const &v, Vector3D const &normal)
Reflect vector.
Definition: Vector3D.cpp:203
double Projection(Vector3D const &v1, Vector3D const &v2)
Calculates the projection of one vector in the direction of the second.
Definition: Vector3D.cpp:193
double CalcAngle(Vector3D const &v1, Vector3D const &v2)
Returns the angle between two vectors (in radians)
Definition: Vector3D.cpp:198
double y
Component in the y direction.
Definition: geometry.hpp:48
vector< double > serialize(void) const
Convert an object to an array of numbers.
Definition: geometry.cpp:174
double fastsqrt(double x)
Fast approximate sqrt.
Definition: utils.cpp:11
Vector3D operator*(double d, Vector3D const &v)
Scalar product.
Definition: Vector3D.cpp:162
Vector2D Rotate(Vector2D const &v, double a)
Rotates a vector.
Definition: geometry.cpp:7
Vector2D pol2cart(double radius, double angle)
Converts from polar coordinates to cartesian coordinates.
Definition: geometry.cpp:150
double ScalarProd(Vector3D const &v1, Vector3D const &v2)
Scalar product of two vectors.
Definition: Vector3D.cpp:185
Vector3D operator/(Vector3D const &v, double d)
Scalar division.
Definition: Vector3D.cpp:176
Vector2D & operator+=(Vector2D const &v)
Addition.
Definition: geometry.cpp:61
Vector2D normalize(const Vector2D &v)
Normalized a vector.
Definition: geometry.cpp:158
Vector2D & operator*=(double s)
Scalar product.
Definition: geometry.cpp:54
void Set(double ix, double iy)
Set vector components.
Definition: geometry.cpp:39
Vector2D & operator-=(Vector2D const &v)
Subtraction.
Definition: geometry.cpp:68
Vector2D(void)
Null constructor.
Definition: geometry.cpp:30
Vector2D & operator=(Vector2D const &v)
Assigment operator.
Definition: geometry.cpp:45
double abs(Vector3D const &v)
Norm of a vector.
Definition: Vector3D.cpp:44
Vector3D operator+(Vector3D const &v1, Vector3D const &v2)
Term by term addition.
Definition: Vector3D.cpp:143
Vector2D calc_mid_point(Vector2D const &v1, Vector2D const &v2)
Calculates the mid point between two vectors.
Definition: geometry.cpp:140
void unserialize(const vector< double > &data)
Convert an array of numbers to an object.
Definition: geometry.cpp:183
2D Mathematical vector
Definition: geometry.hpp:15
double fastabs(Vector2D const &v)
Norm of a vector, less accurate.
Definition: geometry.cpp:24
double x
Component in the x direction.
Definition: geometry.hpp:45
Vector2D zcross(Vector2D const &v)
Cross product of a vector in x,y plane with a unit vector in the z direction.
Definition: geometry.cpp:145
Vector3D operator-(Vector3D const &v1, Vector3D const &v2)
Term by term subtraction.
Definition: Vector3D.cpp:152
double dist_sqr(const Vector2D &v)
Calculates the square of the distance. This is computationaly cheaper then actually calculating the d...
Definition: geometry.cpp:163