00001 #ifndef VEC4_H_IS_INCLUDED
00002 #define VEC4_H_IS_INCLUDED
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "mlib/points.H"
00016 #include "mlib/vec3.H"
00017 #include "mlib/global.H"
00018
00019 namespace mlib {
00020
00021
00022
00023
00024
00025
00026
00027
00028 class Vec4 {
00029
00030 protected:
00031
00032 double elt[4];
00033
00034 public:
00035
00036
00037
00038
00039 explicit Vec4(double s=0) { *this = s; }
00040 Vec4(double x, double y, double z, double w)
00041 { elt[0]=x; elt[1]=y; elt[2]=z; elt[3]=w; }
00042
00043 template <typename V>
00044 Vec4(const Vec3<V> &v, double w = 0.0)
00045 { elt[0]=v[0]; elt[1]=v[1]; elt[2]=v[2]; elt[3]=w; }
00046
00047 template <typename P>
00048 explicit Vec4(const P &p, double w = 1.0)
00049 { elt[0]=p[0]; elt[1]=p[1]; elt[2]=p[2]; elt[3]=w; }
00050
00051 template <typename U>
00052 explicit Vec4(const U v[4])
00053 { elt[0]=v[0]; elt[1]=v[1]; elt[2]=v[2]; elt[3]=v[3]; }
00054
00055
00056
00057 Vec4& operator=(double s) { elt[0]=elt[1]=elt[2]=elt[3]=s; return *this; }
00058
00059
00060
00061
00062 typedef double value_type;
00063 static int dim() { return 4; }
00064
00065
00066
00067
00068
00069
00070 operator double*() { return elt; }
00071 operator const double*() const { return elt; }
00072
00073 #ifndef HAVE_CASTING_LIMITS
00074
00075
00076
00077 #endif
00078
00079
00080
00081
00082
00083
00084 Vec4& operator+=(const Vec4& v)
00085 { elt[0]+=v[0]; elt[1]+=v[1]; elt[2]+=v[2]; elt[3]+=v[3]; return *this; }
00086
00087 Vec4& operator-=(const Vec4& v)
00088 { elt[0]-=v[0]; elt[1]-=v[1]; elt[2]-=v[2]; elt[3]-=v[3]; return *this; }
00089
00090 Vec4& operator*=(double s)
00091 { elt[0] *= s; elt[1] *= s; elt[2] *= s; elt[3] *= s; return *this; }
00092
00093 Vec4& operator/=(double s)
00094 { elt[0] /= s; elt[1] /= s; elt[2] /= s; elt[3] /= s; return *this; }
00095
00096 Vec4 operator+(const Vec4 &v) const
00097 { return Vec4(elt[0]+v[0], elt[1]+v[1], elt[2]+v[2], elt[3]+v[3]); }
00098
00099 Vec4 operator-(const Vec4& v) const
00100 { return Vec4(elt[0]-v[0], elt[1]-v[1], elt[2]-v[2], elt[3]-v[3]); }
00101
00102 Vec4 operator-() const
00103 { return Vec4(-elt[0], -elt[1], -elt[2], -elt[3]); }
00104
00105 Vec4 operator*(double s) const
00106 { return Vec4(elt[0]*s, elt[1]*s, elt[2]*s, elt[3]*s); }
00107
00108 Vec4 operator/(double s) const
00109 { return Vec4(elt[0]/s, elt[1]/s, elt[2]/s, elt[3]/s); }
00110
00111
00112 double operator*(const Vec4 &v) const
00113 { return elt[0]*v[0] + elt[1]*v[1] + elt[2]*v[2] + elt[3]*v[3]; }
00114
00115 friend Vec4 operator*(double s, const Vec4 &v)
00116 { return v*s; }
00117
00118
00119
00120
00121
00122
00123 double length() const
00124 { return sqrt(elt[0]*elt[0]+elt[1]*elt[1]+elt[2]*elt[2]+elt[3]*elt[3]); }
00125 double length_sqrd() const
00126 { return elt[0]*elt[0]+elt[1]*elt[1]+elt[2]*elt[2]+elt[3]*elt[3]; }
00127 double length_rect() const
00128 { return fabs(elt[0])+fabs(elt[1])+fabs(elt[2])+fabs(elt[3]); }
00129
00130
00131
00132
00133
00134
00135 double dist(const Vec4 &v) const
00136 { return ((*this)-v).length(); }
00137 double dist_sqrd(const Vec4 &v) const
00138 { return (*this-v).length_sqrd(); }
00139
00140
00141
00142
00143
00144
00145 Vec4 normalized() const
00146 { double l; return ((l = length()) > gEpsZeroMath) ?
00147 Vec4(elt[0]/l, elt[1]/l, elt[2]/l, elt[3]/l) : Vec4(); }
00148
00149
00150
00151 };
00152
00153
00154
00155
00156
00157
00158
00159 std::ostream &operator<<(std::ostream &out, const Vec4& v);
00160
00161
00162 std::istream &operator>>(std::istream &in, Vec4& v);
00163
00164
00165
00166
00167
00168
00169
00170 Vec4 cross(const Vec4& a, const Vec4& b, const Vec4& c);
00171
00172
00173
00174 Vec3<Wvec> proj(const Vec4& v);
00175
00176 }
00177
00178 #endif // VEC4_H_IS_INCLUDED