00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <vamos/geometry/Three_Vector.h>
00019 #include <vamos/geometry/Three_Matrix.h>
00020
00021 #include <cmath>
00022
00023 const Vamos_Geometry::Three_Vector Vamos_Geometry::
00024 Three_Vector::X = Three_Vector (1.0, 0.0, 0.0);
00025 const Vamos_Geometry::Three_Vector Vamos_Geometry::
00026 Three_Vector::Y = Three_Vector (0.0, 1.0, 0.0);
00027 const Vamos_Geometry::Three_Vector Vamos_Geometry::
00028 Three_Vector::Z = Three_Vector (0.0, 0.0, 1.0);
00029
00030
00031
00032
00033 Vamos_Geometry::
00034 Three_Vector::Three_Vector ()
00035 {
00036 m_vec [0] = 0.0;
00037 m_vec [1] = 0.0;
00038 m_vec [2] = 0.0;
00039 }
00040
00041
00042 Vamos_Geometry::
00043 Three_Vector::Three_Vector (double x, double y, double z)
00044 {
00045 m_vec [0] = x;
00046 m_vec [1] = y;
00047 m_vec [2] = z;
00048 }
00049
00050
00051 Vamos_Geometry::
00052 Three_Vector::Three_Vector (double vec [3])
00053 {
00054 m_vec [0] = vec [0];
00055 m_vec [1] = vec [1];
00056 m_vec [2] = vec [2];
00057 }
00058
00059
00060 Vamos_Geometry::Three_Vector& Vamos_Geometry::
00061 Three_Vector::operator = (const Three_Vector& vec)
00062 {
00063 if (&vec != this)
00064 {
00065 m_vec [0] = vec [0];
00066 m_vec [1] = vec [1];
00067 m_vec [2] = vec [2];
00068 }
00069 return *this;
00070 }
00071
00072
00073 void Vamos_Geometry::
00074 Three_Vector::zero ()
00075 {
00076 m_vec [0] = m_vec [1] = m_vec [2] = 0.0;
00077 }
00078
00079
00080 double Vamos_Geometry::
00081 Three_Vector::dot (const Three_Vector& vec) const
00082 {
00083 return m_vec [0] * vec [0] + m_vec [1] * vec [1] + m_vec [2] * vec [2];
00084 }
00085
00086
00087 Vamos_Geometry::Three_Vector Vamos_Geometry::
00088 Three_Vector::cross (const Three_Vector& vec) const
00089 {
00090 return Three_Vector (m_vec [1] * vec [2] - m_vec [2] * vec [1],
00091 m_vec [2] * vec [0] - m_vec [0] * vec [2],
00092 m_vec [0] * vec [1] - m_vec [1] * vec [0]);
00093 }
00094
00095
00096 Vamos_Geometry::Three_Vector Vamos_Geometry::
00097 Three_Vector::project (const Three_Vector& vec) const
00098 {
00099 double dot_prod = dot (vec);
00100 double vec_abs = vec.abs ();
00101 if (vec.abs () == 0.0)
00102 return Three_Vector (0.0, 0.0, 0.0);
00103 return vec.unit () * dot_prod / vec_abs;
00104 }
00105
00106 Vamos_Geometry::Three_Vector Vamos_Geometry::
00107 Three_Vector::back_project (const Three_Vector& vec) const
00108 {
00109 double dot_prod = dot (vec);
00110 if (dot_prod == 0.0)
00111 return Three_Vector (0.0, 0.0, 0.0);
00112 double this_abs = abs ();
00113 return this_abs * this_abs * vec / dot_prod;
00114 }
00115
00116 double Vamos_Geometry::
00117 Three_Vector::perp_distance (const Three_Vector& point1,
00118 const Three_Vector& point2) const
00119 {
00120 Three_Vector vec1 = (point2 - point1);
00121 Three_Vector vec2 = vec1.project (*this);
00122 return (vec1 - vec2).abs ();
00123 }
00124
00125 double Vamos_Geometry::
00126 Three_Vector::component (const Three_Vector& vec) const
00127 {
00128 double dot_prod = dot (vec);
00129 if (dot_prod == 0.0)
00130 return 0.0;
00131 return dot_prod / vec.abs ();
00132 }
00133
00134
00135 Vamos_Geometry::Three_Vector Vamos_Geometry::
00136 Three_Vector::unit () const
00137 {
00138 Three_Vector vec = *this;
00139 double vec_abs = abs ();
00140 if (vec_abs == 0.0)
00141 return Three_Vector (0.0, 0.0, 1.0);
00142 return vec / vec_abs;
00143 }
00144
00145
00146 double Vamos_Geometry::
00147 Three_Vector::angle (const Three_Vector& vec) const
00148 {
00149 return acos ((*this).dot (vec) / (*this).abs () / vec.abs ());
00150 }
00151
00152 Vamos_Geometry::Three_Vector Vamos_Geometry::
00153 Three_Vector::rotate (double x, double y, double z) const
00154 {
00155 Three_Matrix r;
00156 r.identity();
00157 r.rotate (Three_Vector (x, y, z));
00158 return r * *this;
00159 }
00160
00161
00162 Vamos_Geometry::Three_Vector& Vamos_Geometry::
00163 Three_Vector::operator += (const Three_Vector& vec)
00164 {
00165 m_vec [0] += vec [0];
00166 m_vec [1] += vec [1];
00167 m_vec [2] += vec [2];
00168 return *this;
00169 }
00170
00171 Vamos_Geometry::Three_Vector& Vamos_Geometry::
00172 Three_Vector::operator -= (const Three_Vector& vec)
00173 {
00174 m_vec [0] -= vec [0];
00175 m_vec [1] -= vec [1];
00176 m_vec [2] -= vec [2];
00177 return *this;
00178 }
00179
00180 Vamos_Geometry::Three_Vector& Vamos_Geometry::
00181 Three_Vector::operator *= (double factor)
00182 {
00183 m_vec [0] *= factor;
00184 m_vec [1] *= factor;
00185 m_vec [2] *= factor;
00186 return *this;
00187 }
00188
00189 Vamos_Geometry::Three_Vector& Vamos_Geometry::
00190 Three_Vector::operator /= (double factor)
00191 {
00192 m_vec [0] /= factor;
00193 m_vec [1] /= factor;
00194 m_vec [2] /= factor;
00195 return *this;
00196 }
00197
00198
00199
00200
00201 const Vamos_Geometry::Three_Vector Vamos_Geometry::
00202 operator + (const Three_Vector& vec1, const Three_Vector& vec2)
00203 {
00204 Three_Vector out_vec = vec1;
00205 return out_vec += vec2;
00206 }
00207
00208
00209 const Vamos_Geometry::Three_Vector Vamos_Geometry::
00210 operator - (const Three_Vector& vec)
00211 {
00212 Three_Vector out_vec = vec;
00213 return out_vec *= -1.0;
00214 }
00215
00216
00217 const Vamos_Geometry::Three_Vector Vamos_Geometry::
00218 operator - (const Three_Vector& vec1, const Three_Vector& vec2)
00219 {
00220 Three_Vector out_vec = vec1;
00221 return out_vec -= vec2;
00222 }
00223
00224
00225 const Vamos_Geometry::Three_Vector Vamos_Geometry::
00226 operator * (const Three_Vector& vec, double factor)
00227 {
00228 Three_Vector out_vec = vec;
00229 return out_vec *= factor;
00230 }
00231
00232 const Vamos_Geometry::Three_Vector Vamos_Geometry::
00233 operator * (double factor, const Three_Vector& vec)
00234 {
00235 return vec * factor;
00236 }
00237
00238
00239 const Vamos_Geometry::Three_Vector Vamos_Geometry::
00240 operator / (const Three_Vector& vec, double factor)
00241 {
00242 Three_Vector out_vec = vec;
00243 if (factor == 0.0)
00244 return Three_Vector (0.0, 0.0, 0.0);
00245 return out_vec /= factor;
00246 }
00247
00248 const Vamos_Geometry::Three_Vector Vamos_Geometry::
00249 operator / (double factor, const Three_Vector& vec)
00250 {
00251 return vec / factor;
00252 }
00253
00254 bool Vamos_Geometry::
00255 operator == (const Three_Vector& vec1, const Three_Vector& vec2)
00256 {
00257 return (vec1 [0] == vec2 [0])
00258 && (vec1 [1] == vec2 [1])
00259 && (vec1 [2] == vec2 [2]);
00260 }
00261
00262
00263 std::ostream& Vamos_Geometry::
00264 operator << (std::ostream& os, const Three_Vector& vec)
00265 {
00266 os << "[ " << vec [0]
00267 << ", " << vec [1]
00268 << ", " << vec [2] << " ]";
00269 return os;
00270 }
00271
00272 std::istream& Vamos_Geometry::
00273 operator >> (std::istream& is, Three_Vector& vec)
00274 {
00275 char delim;
00276 is >> delim >> vec [0] >> delim >> vec [1] >> delim >> vec [2] >> delim;
00277 return is;
00278 }