source: src/base/vector.hpp@ e7e9a6

Last change on this file since e7e9a6 was dfed1c, checked in by Julian Iseringhausen <isering@…>, 14 years ago

Major vmg update.

git-svn-id: https://svn.version.fz-juelich.de/scafacos/trunk@1136 5161e1c8-67bf-11de-9fd5-51895aff932f

  • Property mode set to 100644
File size: 4.5 KB
Line 
1/**
2 * @file vector.hpp
3 * @author Julian Iseringhausen <isering@ins.uni-bonn.de>
4 * @date Mon Apr 18 12:26:13 2011
5 *
6 * @brief VMG::Vector
7 *
8 *
9 */
10
11#ifndef VECTOR_HPP_
12#define VECTOR_HPP_
13
14#include <algorithm>
15#include <cmath>
16#include <iostream>
17
18namespace VMG
19{
20
21class Index;
22
23class Vector
24{
25public:
26 Vector(const Index& index);
27 Vector(const vmg_float& x, const vmg_float& y, const vmg_float& z);
28 Vector(const vmg_float& val);
29 Vector(const vmg_float* arr);
30 Vector();
31
32 vmg_float& operator[](const int& index) {return i[index];}
33 const vmg_float& operator[](const int& index) const {return i[index];}
34
35 vmg_float& X() {return i[0];}
36 vmg_float& Y() {return i[1];}
37 vmg_float& Z() {return i[2];}
38
39 const vmg_float& X() const {return i[0];}
40 const vmg_float& Y() const {return i[1];}
41 const vmg_float& Z() const {return i[2];}
42
43 Vector Abs() const {return Vector(fabs(i[0]), fabs(i[1]), fabs(i[2]));}
44 vmg_float Length() const {return sqrt(i[0]*i[0]+i[1]*i[1]+i[2]*i[2]);}
45 vmg_float Max() const {return std::max(std::max(i[0],i[1]),i[2]);}
46 vmg_float Min() const {return std::min(std::min(i[0],i[1]),i[2]);}
47 vmg_float Product() const {return i[0]*i[1]*i[2];}
48
49 Vector MaxComponentwise(const Vector& rhs) const
50 {
51 return Vector(std::max(i[0], rhs.i[0]), std::max(i[1], rhs.i[1]), std::max(i[2], rhs.i[2]));
52 }
53
54 Vector MinComponentwise(const Vector& rhs) const
55 {
56 return Vector(std::min(i[0], rhs.i[0]), std::min(i[1], rhs.i[1]), std::min(i[2], rhs.i[2]));
57 }
58
59 vmg_float* vec() {return i;}
60 const vmg_float* vec() const {return i;}
61
62 Vector& operator=(const Vector& rhs)
63 {
64 i[0] = rhs.X();
65 i[1] = rhs.Y();
66 i[2] = rhs.Z();
67 return *this;
68 }
69
70 Vector& operator=(const vmg_float& rhs)
71 {
72 i[0] = rhs;
73 i[1] = rhs;
74 i[2] = rhs;
75 return *this;
76 }
77
78 bool operator==(const Vector& other) const
79 {
80 return (i[0]==other.X() && i[1]==other.Y() && i[2]==other.Z());
81 }
82
83 bool operator!=(const Vector& other) const
84 {
85 return !(*this == other);
86 }
87
88 Vector& operator+=(const Vector& rhs)
89 {
90 i[0] += rhs.X();
91 i[1] += rhs.Y();
92 i[2] += rhs.Z();
93 return *this;
94 }
95
96 Vector& operator-=(const Vector& rhs)
97 {
98 i[0] -= rhs.X();
99 i[1] -= rhs.Y();
100 i[2] -= rhs.Z();
101 return *this;
102 }
103
104 Vector& operator*=(const Vector& rhs)
105 {
106 i[0] *= rhs.X();
107 i[1] *= rhs.Y();
108 i[2] *= rhs.Z();
109 return *this;
110 }
111
112 Vector& operator/=(const Vector& rhs)
113 {
114 i[0] /= rhs.X();
115 i[1] /= rhs.Y();
116 i[2] /= rhs.Z();
117 return *this;
118 }
119
120 Vector& operator+=(const vmg_float& rhs)
121 {
122 i[0] += rhs;
123 i[1] += rhs;
124 i[2] += rhs;
125 return *this;
126 }
127
128 Vector& operator-=(const vmg_float& rhs)
129 {
130 i[0] -= rhs;
131 i[1] -= rhs;
132 i[2] -= rhs;
133 return *this;
134 }
135
136 Vector& operator*=(const vmg_float& rhs)
137 {
138 i[0] *= rhs;
139 i[1] *= rhs;
140 i[2] *= rhs;
141 return *this;
142 }
143
144 Vector& operator/=(const vmg_float& rhs)
145 {
146 i[0] /= rhs;
147 i[1] /= rhs;
148 i[2] /= rhs;
149 return *this;
150 }
151
152 const Vector operator+(const Vector& rhs) const
153 {
154 return Vector(*this) += rhs;
155 }
156
157 const Vector operator-(const Vector& rhs) const
158 {
159 return Vector(*this) -= rhs;
160 }
161
162 const Vector operator*(const Vector& rhs) const
163 {
164 return Vector(*this) *= rhs;
165 }
166
167 const Vector operator/(const Vector& rhs) const
168 {
169 return Vector(*this) /= rhs;
170 }
171
172 const Vector operator+(const vmg_float& rhs) const
173 {
174 return Vector(*this) += rhs;
175 }
176
177 const Vector operator-(const vmg_float& rhs) const
178 {
179 return Vector(*this) -= rhs;
180 }
181
182 const Vector operator*(const vmg_float& rhs) const
183 {
184 return Vector(*this) *= rhs;
185 }
186
187 const Vector operator/(const vmg_float& rhs) const
188 {
189 return Vector(*this) /= rhs;
190 }
191
192private:
193 vmg_float i[3];
194};
195
196inline const Vector operator+(const vmg_float& lhs, const Vector& rhs)
197{
198 return Vector(lhs) += rhs;
199}
200
201inline const Vector operator-(const vmg_float& lhs, const Vector& rhs)
202{
203 return Vector(lhs) -= rhs;
204}
205
206inline const Vector operator*(const vmg_float& lhs, const Vector& rhs)
207{
208 return Vector(lhs) *= rhs;
209}
210
211inline const Vector operator/(const vmg_float& lhs, const Vector& rhs)
212{
213 return Vector(lhs) /= rhs;
214}
215
216inline vmg_float Norm_2(const Vector& vec)
217{
218 return sqrt(vec.X()*vec.X()+vec.Y()*vec.Y()+vec.Z()*vec.Z());
219}
220
221inline vmg_float InnerProduct(const Vector& vec1, const Vector& vec2)
222{
223 return vec1.X()*vec2.X()+vec1.Y()*vec2.Y()+vec1.Z()*vec2.Z();
224}
225
226std::ostream& operator<<(std::ostream& out, const Vector& vector);
227
228}
229
230#endif /* VECTOR_HPP_ */
Note: See TracBrowser for help on using the repository browser.