src/work/athos/xy/xy.h
changeset 202 0bd4fe53b1d0
child 207 9910d5a5be7f
equal deleted inserted replaced
-1:000000000000 0:1652a018aa5b
       
     1 /**
       
     2 2 dimensional vector (plainvector) implementation
       
     3 
       
     4 */
       
     5 #ifndef HUGO_XY_H
       
     6 #define HUGO_XY_H
       
     7 
       
     8 #include <iostream>
       
     9 
       
    10 using namespace std;
       
    11 template<typename T>
       
    12 class xy {
       
    13   T _x,_y;
       
    14 
       
    15 public:
       
    16 
       
    17   ///Default constructor: both coordinates become 0
       
    18   xy() { _x=_y=0; }
       
    19 
       
    20   ///Constructing from coordinates
       
    21   xy(T a, T b) { _x=a; _y=b; }
       
    22 
       
    23   ///Gives back the x coordinate
       
    24   T x(){
       
    25     return _x;
       
    26   };
       
    27 
       
    28   ///Gives back the y coordinate
       
    29   T y(){
       
    30     return _y;
       
    31   };
       
    32 
       
    33   ///Gives back the square of the norm of the vector
       
    34   T normSquare(){
       
    35     return _x*_x+_y*_y;
       
    36   };
       
    37   
       
    38   ///Increments the left hand side by u
       
    39   xy<T>& operator +=(const xy<T>& u){
       
    40     _x += u._x;
       
    41     _y += u._y;
       
    42     return *this;
       
    43   };
       
    44   
       
    45   ///Decrements the left hand side by u
       
    46   xy<T>& operator -=(const xy<T>& u){
       
    47     _x -= u._x;
       
    48     _y -= u._y;
       
    49     return *this;
       
    50   };
       
    51 
       
    52   ///Multiplying the left hand side with a scalar
       
    53   xy<T>& operator *=(const T &u){
       
    54     _x *= u;
       
    55     _y *= u;
       
    56     return *this;
       
    57   };
       
    58   
       
    59   ///Returns the scalar product of two vectors
       
    60   T operator *(const xy<T>& u){
       
    61     return _x*u._x+_y*u._y;
       
    62   };
       
    63   
       
    64   ///Returns the sum of two vectors
       
    65   xy<T> operator+(const xy<T> &u) const {
       
    66     xy<T> b=*this;
       
    67     return b+=u;
       
    68   };
       
    69 
       
    70   ///Returns the difference of two vectors
       
    71   xy<T> operator-(const xy<T> &u) const {
       
    72     xy<T> b=*this;
       
    73     return b-=u;
       
    74   };
       
    75 
       
    76   ///Returns a vector multiplied by a scalar
       
    77   xy<T> operator*(const T &u) const {
       
    78     xy<T> b=*this;
       
    79     return b*=u;
       
    80   };
       
    81 
       
    82   ///Testing equality
       
    83   bool operator==(const xy<T> &u){
       
    84     return (_x==u._x) && (_y==u._y);
       
    85   };
       
    86 
       
    87   ///Testing inequality
       
    88   bool operator!=(xy u){
       
    89     return  (_x!=u._x) || (_y!=u._y);
       
    90   };
       
    91 
       
    92 };
       
    93 ///Reading a plainvector from a stream
       
    94 template<typename T>
       
    95 inline
       
    96 istream& operator>>(istream &is, xy<T> &z)
       
    97 {
       
    98   ///This is not the best solution here: I didn't know how to solve this with friend functions
       
    99   T a,b;
       
   100   is >> a >> b;
       
   101   xy<T> buf(a,b);
       
   102   z=buf;
       
   103   return is;
       
   104 }
       
   105 
       
   106 ///Outputting a plainvector to a stream
       
   107 template<typename T>
       
   108 inline
       
   109 ostream& operator<<(ostream &os, xy<T> z)
       
   110 {
       
   111 	os << "(" << z.x() << ", " << z.y() << ")";
       
   112 	return os;
       
   113 }
       
   114 
       
   115 
       
   116 
       
   117 #endif //HUGO_XY_H