Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/clhep/include/CLHEP/Vector/TwoVector.h

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 // -*- C++ -*-
  2 // CLASSDOC OFF
  3 // ---------------------------------------------------------------------------
  4 // CLASSDOC ON
  5 //
  6 // This file is a part of the CLHEP - a Class Library for High Energy Physics.
  7 //
  8 // Hep2Vector is a general 2-vector class defining vectors in two 
  9 // dimension using double components.   It comes from the ZOOM
 10 // PlaneVector class (the PhysicsVectors PlaneVector.h will typedef
 11 // PlaneVector to Hep2Vector).
 12 //
 13 // .SS See Also
 14 // ThreeVector.h
 15 //
 16 // .SS Authors
 17 // John Marraffino and Mark Fischler
 18 //
 19 
 20 #ifndef HEP_TWOVECTOR_H
 21 #define HEP_TWOVECTOR_H
 22 
 23 #include <iostream>
 24 
 25 #include "CLHEP/Vector/ThreeVector.h" 
 26 
 27 namespace CLHEP {
 28 
 29 // Declarations of classes and global methods
 30 class Hep2Vector;
 31 std::ostream & operator << (std::ostream &, const Hep2Vector &);
 32 std::istream & operator >> (std::istream &, Hep2Vector &);
 33 inline double operator * (const Hep2Vector & a,const Hep2Vector & b);
 34 inline Hep2Vector operator * (const Hep2Vector & p, double a);
 35 inline Hep2Vector operator * (double a, const Hep2Vector & p);
 36        Hep2Vector operator / (const Hep2Vector & p, double a);
 37 inline Hep2Vector operator + (const Hep2Vector & a, const Hep2Vector & b);
 38 inline Hep2Vector operator - (const Hep2Vector & a, const Hep2Vector & b);
 39 
 40 /**
 41  * @author
 42  * @ingroup vector
 43  */
 44 class Hep2Vector {
 45 
 46 public:
 47 
 48   enum { X=0, Y=1, NUM_COORDINATES=2, SIZE=NUM_COORDINATES };
 49   // Safe indexing of the coordinates when using with matrices, arrays, etc.
 50 
 51   inline Hep2Vector( double x = 0.0, double y = 0.0 );
 52   // The constructor.
 53 
 54   inline Hep2Vector(const Hep2Vector & p);
 55   inline Hep2Vector(Hep2Vector && p) = default;
 56   // The copy and move constructors.
 57 
 58   explicit Hep2Vector( const Hep3Vector & );
 59   // "demotion" constructor"
 60   // WARNING -- THIS IGNORES THE Z COMPONENT OF THE Hep3Vector.
 61   //    SO IN GENERAL, Hep2Vector(v)==v WILL NOT HOLD!
 62 
 63   inline ~Hep2Vector();
 64   // The destructor.
 65 
 66   inline double x() const;
 67   inline double y() const;
 68   // The components in cartesian coordinate system.
 69 
 70          double operator () (int i) const;
 71   inline double operator [] (int i) const;
 72   // Get components by index.  0-based.
 73 
 74          double & operator () (int i);
 75   inline double & operator [] (int i);
 76   // Set components by index.  0-based.
 77 
 78   inline void setX(double x);
 79   inline void setY(double y);
 80   inline void set (double x, double y);
 81   // Set the components in cartesian coordinate system.
 82 
 83   inline double phi() const;
 84   // The azimuth angle.
 85 
 86   inline double mag2() const;
 87   // The magnitude squared.
 88 
 89   inline double mag() const;
 90   // The magnitude.
 91 
 92   inline double r() const;
 93   // r in polar coordinates (r, phi):  equal to mag().
 94 
 95   inline void setPhi(double phi);
 96   // Set phi keeping mag constant.
 97 
 98   inline void setMag(double r);
 99   // Set magnitude keeping phi constant.
100 
101   inline void setR(double r);
102   // Set R keeping phi constant.  Same as setMag.
103 
104   inline void setPolar(double r, double phi);
105   // Set by polar coordinates.
106 
107   inline Hep2Vector & operator = (const Hep2Vector & p);
108   inline Hep2Vector & operator = (Hep2Vector && p) = default;
109   // The copy and move assignment operators.
110 
111   inline bool operator == (const Hep2Vector & v) const;
112   inline bool operator != (const Hep2Vector & v) const;
113   // Comparisons.
114 
115   int compare (const Hep2Vector & v) const;
116   bool operator > (const Hep2Vector & v) const;
117   bool operator < (const Hep2Vector & v) const;
118   bool operator>= (const Hep2Vector & v) const;
119   bool operator<= (const Hep2Vector & v) const;
120   // dictionary ordering according to y, then x component
121 
122   static inline double getTolerance();
123   static double setTolerance(double tol);
124 
125   double howNear (const Hep2Vector &p) const;
126   bool isNear  (const Hep2Vector & p, double epsilon=tolerance) const;
127 
128   double howParallel (const Hep2Vector &p) const;
129   bool isParallel 
130     (const Hep2Vector & p, double epsilon=tolerance) const;
131 
132   double howOrthogonal (const Hep2Vector &p) const;
133   bool isOrthogonal
134     (const Hep2Vector & p, double epsilon=tolerance) const;
135 
136   inline Hep2Vector & operator += (const Hep2Vector &p);
137   // Addition.
138 
139   inline Hep2Vector & operator -= (const Hep2Vector &p);
140   // Subtraction.
141 
142   inline Hep2Vector operator - () const;
143   // Unary minus.
144 
145   inline Hep2Vector & operator *= (double a);
146   // Scaling with real numbers.
147 
148   inline Hep2Vector unit() const;
149   // Unit vector parallel to this.
150 
151   inline Hep2Vector orthogonal() const;
152   // Vector orthogonal to this.
153 
154   inline double dot(const Hep2Vector &p) const;
155   // Scalar product.
156 
157   inline double angle(const Hep2Vector &) const;
158   // The angle w.r.t. another 2-vector.
159 
160   void rotate(double);
161   // Rotates the Hep2Vector.
162 
163   operator Hep3Vector () const;
164   // Cast a Hep2Vector as a Hep3Vector.
165 
166   // The remaining methods are friends, thus defined at global scope:
167   // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
168 
169   friend std::ostream & operator<< (std::ostream &, const Hep2Vector &);
170   // Output to a stream.
171 
172   inline friend double operator * (const Hep2Vector & a,
173            const Hep2Vector & b);
174   // Scalar product.
175 
176   inline friend Hep2Vector operator * (const Hep2Vector & p, double a);
177   // v*c
178 
179   inline friend Hep2Vector operator * (double a, const Hep2Vector & p);
180   // c*v
181 
182          friend Hep2Vector operator / (const Hep2Vector & p, double a);
183   // v/c
184 
185   inline friend Hep2Vector operator + (const Hep2Vector & a,
186                const Hep2Vector & b);
187   // v1+v2
188 
189   inline friend Hep2Vector operator - (const Hep2Vector & a,
190                 const Hep2Vector & b);
191   // v1-v2
192 
193   static const int ZMpvToleranceTicks = 100;
194 
195 private:
196 
197   double dx;
198   double dy;
199   // The components.
200 
201   static double tolerance;
202   // default tolerance criterion for isNear() to return true.
203 
204 };  // Hep2Vector
205 
206 static const Hep2Vector X_HAT2(1.0, 0.0);
207 static const Hep2Vector Y_HAT2(0.0, 1.0);
208 
209 }  // namespace CLHEP
210 
211 #include "CLHEP/Vector/TwoVector.icc"
212 
213 #endif /* HEP_TWOVECTOR_H */
214