OpenStructure
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
vec4.hh
Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // This file is part of the OpenStructure project <www.openstructure.org>
3 //
4 // Copyright (C) 2008-2011 by the OpenStructure authors
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License as published by the Free
8 // Software Foundation; either version 3.0 of the License, or (at your option)
9 // any later version.
10 // This library is distributed in the hope that it will be useful, but WITHOUT
11 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
13 // details.
14 //
15 // You should have received a copy of the GNU Lesser General Public License
16 // along with this library; if not, write to the Free Software Foundation, Inc.,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 //------------------------------------------------------------------------------
19 #ifndef GEOM_VEC4_H
20 #define GEOM_VEC4_H
21 
22 #include <stdexcept>
23 #include <cassert>
24 #include <cstddef> // for size_t
25 #include <ostream>
26 
27 #include <boost/operators.hpp>
28 
30 #include <ost/config.hh>
31 
32 namespace geom {
33 
34 // fw decl
35 class Vec2;
36 class Vec3;
37 
38 /*
39  Four dimensional, homogeneous vector class, using Real precision.
40 */
41 class DLLEXPORT Vec4:
42  private boost::equality_comparable<Vec4>,
43  private boost::additive<Vec4>,
44  private boost::additive<Vec4, Real>,
45  private boost::multiplicative<Vec4, Real>
46 {
47 public:
49  Vec4(): x(0), y(0), z(0), w(1) { }
50 
52  Vec4(Real px, Real py, Real pz, Real pw): x(px), y(py), z(pz), w(pw) { }
53 
55  Vec4(const Vec4& v): x(v[0]), y(v[1]), z(v[2]), w(v[3]) { }
56 
58  Vec4(const Vec2& v);
59 
61  Vec4(const Vec3& v);
62 
64  explicit Vec4(const float v[4]): x(v[0]), y(v[1]), z(v[2]), w(v[3]) { }
65 
67  explicit Vec4(const double v[4]): x(v[0]), y(v[1]), z(v[2]), w(v[3]) { }
69  Vec4& operator=(const Vec4& v)
70  {
71  x=v.x;
72  y=v.y;
73  z=v.z;
74  w=v.w;
75  return *this;
76  }
77 
79  bool operator==(const Vec4& rhs) const
80  {
81  return x==rhs.x && y==rhs.y && z==rhs.z && w==rhs.w;
82  }
83 
85  Real& operator[](std::size_t indx)
86  {
87  assert(indx<4);
88  return (&x)[indx];
89  }
90 
92  const Real& operator[](std::size_t indx) const
93  {
94  assert(indx<4);
95  return (&x)[indx];
96  }
97 
98  Real& At(size_t indx) {
99  if (indx>3) {
100  throw std::out_of_range("index must be smaller than 4");
101  }
102  return (&x)[indx];
103  }
104 
105  const Real& At(size_t indx) const {
106  if (indx>3) {
107  throw std::out_of_range("index must be smaller than 4");
108  }
109  return (&x)[indx];
110  }
111 
113  Real GetX() const { return x; }
114  Real GetY() const { return y; }
115  Real GetZ() const { return z; }
116  Real GetW() const { return w; }
117 
118  void SetX(Real v) { x=v; }
119  void SetY(Real v) { y=v; }
120  void SetZ(Real v) { z=v; }
121  void SetW(Real v) { w=v; }
122 
124  Vec4& operator+=(const Vec4& rhs)
125  {
126  x+=rhs.x;
127  y+=rhs.y;
128  z+=rhs.z;
129  w+=rhs.w;
130  return *this;
131  }
132 
133  Vec4& operator+=(Real d)
134  {
135  x+=d;
136  y+=d;
137  z+=d;
138  w+=d;
139  return *this;
140  }
141 
143  Vec4& operator-=(const Vec4& rhs)
144  {
145  x-=rhs.x;
146  y-=rhs.y;
147  z-=rhs.z;
148  w-=rhs.w;
149  return *this;
150  }
151 
152  Vec4& operator-=(Real d)
153  {
154  x-=d;
155  y-=d;
156  z-=d;
157  w-=d;
158  return *this;
159  }
161  Vec4 operator-() const
162  {
163  return Vec4(-x, -y, -z, -w);
164  }
165 
167  Vec4& operator*=(Real d)
168  {
169  x*=d;
170  y*=d;
171  z*=d;
172  w*=d;
173  return *this;
174  }
175 
177  Vec4& operator/=(Real d)
178  {
179  Real one_over_d=Real(1.0)/d;
180  x*=one_over_d;
181  y*=one_over_d;
182  z*=one_over_d;
183  w*=one_over_d;
184  return *this;
185  }
186 
187  Real* Data() {return &x;}
188  const Real* Data() const {return &x;}
189 
194 };
195 
196 inline Vec4 operator/(Real d, const Vec4& v)
197 {
198  Vec4 nrvo(d/v[0],d/v[1],d/v[2],d/v[3]);
199  return nrvo;
200 }
201 
202 inline std::ostream& operator<<(std::ostream& os, const Vec4& v)
203 {
204  os << "(" << v[0] << "," << v[1] << "," << v[2] << "," << v[3] << ")";
205  return os;
206 }
207 }
208 
209 #include <ost/geom/vec2.hh>
210 #include <ost/geom/vec3.hh>
211 
212 namespace geom {
213 
215 inline Vec4::Vec4(const Vec2& v): x(v.x), y(v.y), z(0), w(1) { }
216 
218 inline Vec4::Vec4(const Vec3& v): x(v.x), y(v.y), z(v.z), w(1.0) { }
219 
220 } // namespace geom
221 
222 # endif