00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 #ifndef _Matrix_coordinate_h_
00026 #define _Matrix_coordinate_h_
00027 
00028 #include "matrix_global.h"
00029 #include "matrixTool.h"
00030 
00031 
00032 namespace PLib {
00033 
00034 
00042   class Coordinate {
00043   public:
00044     int i,j ;
00045     Coordinate() 
00046       { i=0;j=0;} 
00047     Coordinate(int I, int J) 
00048       { i=I ; j=J ; }
00049     Coordinate(int a) 
00050       { i=j=a; }
00051 
00052     const Coordinate& operator=(const Coordinate& c)
00053       {i=c.i; j=c.j; return *this ;}
00054     friend int operator==(const Coordinate& a, const Coordinate& b)
00055       { return ( a.i == b.i && a.j == b.j ); }
00056 
00057     friend float distance2(const Coordinate& a){ return float(a.i*a.i) + float(a.j*a.j) ; }
00058     friend float distance(const Coordinate& a) { return sqrt(distance(a)) ; }
00059 
00060     friend Coordinate operator-(const Coordinate& a, const Coordinate& b){ Coordinate m ; m.i = a.i-b.i ; m.j = a.j-b.j ; return m ; }
00061     friend Coordinate operator+(const Coordinate& a, const Coordinate& b){ Coordinate m ; m.i = a.i+b.i ; m.j = a.j+b.j ; return m ; }
00062 
00063     friend ostream& operator<<(ostream& os, const Coordinate& point);
00064     friend istream& operator>>(istream& os, Coordinate& point);
00065   };
00066 
00067   inline int operator<(const Coordinate& a, const Coordinate& b){ 
00068     return (a.i<b.i && a.j<b.j ) ; } 
00069   inline int operator>(const Coordinate& a, const Coordinate& b){ 
00070     return (a.i>b.i && a.j>b.j ) ; } 
00071   inline int operator<=(const Coordinate& a, const Coordinate& b){ 
00072     return (a.i<=b.i && a.j<=b.j ) ; } 
00073   inline int operator>=(const Coordinate& a, const Coordinate& b){ 
00074     return (a.i>=b.i && a.j>=b.j ) ; } 
00075 
00076 
00090   inline ostream& operator<<(ostream& os,const Coordinate& c)
00091   {
00092     os << c.i << " " << c.j << " " ;
00093     return os;  
00094   }
00095 
00096 
00109   inline istream& operator>>(istream& os, Coordinate& c){
00110     os >> c.i >> c.j ;
00111     return os ;
00112   }
00113 
00114 
00115   inline Coordinate minimum(Coordinate a, Coordinate b){
00116     Coordinate m ;
00117     m.i = minimum(a.i,b.i) ;
00118     m.j = minimum(a.j,b.j) ;
00119     return m ;
00120   }
00121 
00122   inline Coordinate maximum(Coordinate a, Coordinate b){
00123     Coordinate m ;
00124     m.i = maximum(a.i,b.i) ;
00125     m.j = maximum(a.j,b.j) ;
00126     return m ;
00127   }
00128 
00129 
00130   template <class T>
00131   inline Coordinate minimumByRef(const Coordinate &a, const Coordinate &b){
00132     Coordinate m ;
00133     m.i = minimum(a.i,b.i) ;
00134     m.j = minimum(a.j,b.j) ;
00135     return m ;
00136   }
00137 
00138 
00139   inline Coordinate maximumByRef(const Coordinate &a, const Coordinate &b){
00140     Coordinate m ;
00141     m.i = maximum(a.i,b.i) ;
00142     m.j = maximum(a.j,b.j) ;
00143     return m ;
00144   }
00145 
00146 
00147 } 
00148 
00149 #endif