Cartesian.h
1//-*-C++-*-
2/***************************************************************************
3 *
4 * Copyright (C) 2000 by Willem van Straten
5 * Licensed under the Academic Free License version 2.1
6 *
7 ***************************************************************************/
8
9// psrchive/Util/genutil/Cartesian.h
10
11#ifndef __CARTESIAN_H
12#define __CARTESIAN_H
13
14#include <iostream>
15#include "Angle.h"
16
17class Cartesian
18{
19 public:
20 double x, y, z;
21
22 Cartesian (double ux = 0.0, double uy = 0.0, double uz = 0.0)
23 { x=ux; y=uy; z=uz; }
24
25 Cartesian (const Cartesian& u)
26 { x=u.x; y=u.y; z=u.z; }
27
28 Cartesian (const AnglePair& spherical);
29
30 Cartesian & operator = (const Cartesian& u)
31 { x=u.x; y=u.y; z=u.z; return *this; }
32
33 Cartesian & operator += (const Cartesian& u)
34 { x+=u.x; y+=u.y; z+=u.z; return *this; }
35
36 Cartesian & operator -= (const Cartesian& u)
37 { x-=u.x; y-=u.y; z-=u.z; return *this; }
38
39 Cartesian & operator *= (double a)
40 { x*=a; y*=a; z*=a; return *this; }
41
42 Cartesian & operator /= (double a)
43 { return operator *= (1.0/a); }
44
45 double& operator[] (int d)
46 { return *(&x+d); }
47
48 operator double* ()
49 { return &x; }
50
51 const double& operator [] (int d) const
52 { return *(&x+d); }
53
54 const friend Cartesian operator + (Cartesian a, const Cartesian& b)
55 { return a+=b; }
56
57 const friend Cartesian operator - (Cartesian a, const Cartesian& b)
58 { return a-=b; }
59
60 const friend Cartesian operator - (const Cartesian& b)
61 { return Cartesian (-b.x, -b.y, -b.z); }
62
63 const friend Cartesian operator * (Cartesian a, double c)
64 { return a*=c; }
65
66 const friend Cartesian operator / (Cartesian a, double c)
67 { return a*=1.0/c; }
68
69 const friend Cartesian operator * (double a, const Cartesian& v)
70 { return v * a; }
71
72 // just does a piece-wise division (x/x, y/y, z/z)
73 const friend Cartesian pdiv (const Cartesian &, const Cartesian &);
74 // just does a piece-wise multiplication (x*x, y*y, z*z)
75 const friend Cartesian pmult (const Cartesian &, const Cartesian &);
76
77 // cross product
78 const friend Cartesian cross (const Cartesian& c1, const Cartesian& c2)
79 { return Cartesian ( c1.y * c2.z - c1.z * c2.y,
80 c1.z * c2.x - c1.x * c2.z,
81 c1.x * c2.y - c1.y * c2.x ); }
82
83 // cross product
84 const friend Cartesian operator % (const Cartesian &, const Cartesian &);
85 // scalar product
86 friend double operator * (const Cartesian &, const Cartesian &);
87
88 friend int operator == (const Cartesian &, const Cartesian &);
89 friend int operator != (const Cartesian &, const Cartesian &);
90
91 friend Cartesian min (const Cartesian& cart1, const Cartesian& cart2);
92 friend Cartesian max (const Cartesian& cart1, const Cartesian& cart2);
93 friend void diagonalize (Cartesian& bottom_left, Cartesian& upper_right);
94
95 double modSquared () const
96 { return x*x + y*y + z*z; }
97
98 double mod () const
99 { return sqrt (x*x + y*y + z*z); }
100
101 // rotates the point about the specifies axis
102 void x_rot (const Angle& phi);
103 void y_rot (const Angle& phi);
104 void z_rot (const Angle& phi);
105
106 // rotates the point about an arbitrary vector
107 void rot (const Cartesian& r_vect, const Angle& phi);
108
109 static Angle angularSeparation (const Cartesian& c1, const Cartesian& c2);
110
111 static void rotate (double& x1, double& x2, double radians);
112
113};
114
115std::ostream& operator<< (std::ostream& ostr, const Cartesian&);
116
117#endif // __CARTESIAN_H

Generated using doxygen 1.14.0