src/vamos/geometry/Three_Vector.cc

Go to the documentation of this file.
00001 //      Vamos Automotive Simulator
00002 //  Copyright (C) 2001--2002 Sam Varner
00003 //
00004 //  This program is free software; you can redistribute it and/or modify
00005 //  it under the terms of the GNU General Public License as published by
00006 //  the Free Software Foundation; either version 2 of the License, or
00007 //  (at your option) any later version.
00008 //
00009 //  This program is distributed in the hope that it will be useful,
00010 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 //  GNU General Public License for more details.
00013 //
00014 //  You should have received a copy of the GNU General Public License
00015 //  along with this program; if not, write to the Free Software
00016 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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 // Constructors.
00031 
00032 // Default constructor.  Set all elements to 0.0.
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 // Elements are initialized by arguments.
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 // Elements are initialized by a C-style array.
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 // Copy assignment.
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 // Zero all elements.
00073 void Vamos_Geometry::
00074 Three_Vector::zero ()
00075 {
00076   m_vec [0] = m_vec [1] = m_vec [2] = 0.0;
00077 }
00078 
00079 // Return the dot product with the argument.
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 // Return the cross product with the argument.
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 // Return the projection along the argument.
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 // Return the unit vector that points along this vector.
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 // Return the angle between this vector and `vec'.
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 //* Member operators.
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 //* Non-Member Operators
00199 
00200 // Addition
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 // Negation
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 // Subtraction
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 // Scalar Multiplication
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 // Scalar Division
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 // Stream Operators
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 }

Generated on Thu Oct 19 04:05:55 2006 by  doxygen 1.4.6