00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef LUX_VECTOR_H
00024 #define LUX_VECTOR_H
00025
00026 #include <iostream>
00027
00028
00029 namespace lux
00030 {
00031
00032 class Point;
00033 class Normal;
00034
00035 class Vector {
00036 friend class boost::serialization::access;
00037 public:
00038
00039 Vector(float _x=0, float _y=0, float _z=0)
00040 : x(_x), y(_y), z(_z) {
00041 }
00042 explicit Vector(const Point &p);
00043 Vector operator+(const Vector &v) const {
00044 return Vector(x + v.x, y + v.y, z + v.z);
00045 }
00046
00047 Vector& operator+=(const Vector &v) {
00048 x += v.x; y += v.y; z += v.z;
00049 return *this;
00050 }
00051 Vector operator-(const Vector &v) const {
00052 return Vector(x - v.x, y - v.y, z - v.z);
00053 }
00054
00055 Vector& operator-=(const Vector &v) {
00056 x -= v.x; y -= v.y; z -= v.z;
00057 return *this;
00058 }
00059 bool operator==(const Vector &v) const {
00060 return x == v.x && y == v.y && z == v.z;
00061 }
00062 Vector operator*(float f) const {
00063 return Vector(f*x, f*y, f*z);
00064 }
00065
00066 Vector &operator*=(float f) {
00067 x *= f; y *= f; z *= f;
00068 return *this;
00069 }
00070 Vector operator/(float f) const {
00071
00072 float inv = 1.f / f;
00073 return Vector(x * inv, y * inv, z * inv);
00074 }
00075
00076 Vector &operator/=(float f) {
00077
00078 float inv = 1.f / f;
00079 x *= inv; y *= inv; z *= inv;
00080 return *this;
00081 }
00082 Vector operator-() const {
00083 return Vector(-x, -y, -z);
00084 }
00085 float operator[](int i) const {
00086 BOOST_ASSERT(i >= 0 && i <= 2);
00087 return (&x)[i];
00088 }
00089
00090 float &operator[](int i) {
00091 BOOST_ASSERT(i >= 0 && i <= 2);
00092 return (&x)[i];
00093 }
00094 float LengthSquared() const { return x*x + y*y + z*z; }
00095 float Length() const { return sqrtf(LengthSquared()); }
00096 explicit Vector(const Normal &n);
00097
00098 float x, y, z;
00099
00100 private:
00101 template<class Archive>
00102 void serialize(Archive & ar, const unsigned int version)
00103 {
00104 ar & x;
00105 ar & y;
00106 ar & z;
00107 }
00108 };
00109
00110 inline ostream &operator<<(ostream &os, const Vector &v) {
00111 os << v.x << ", " << v.y << ", " << v.z;
00112 return os;
00113 }
00114 inline Vector operator*(float f, const Vector &v) {
00115 return v*f;
00116 }
00117
00118 }
00119
00120 #endif //LUX_VECTOR_H