00001 00005 #ifndef _VETOR__H 00006 #define _VETOR__H 00007 00008 #include <math.h> 00009 00017 template <class TIPO> 00018 class Vetor 00019 { 00020 public: 00021 TIPO X, Y; 00022 00023 /* Construtores */ 00024 Vetor(); 00025 Vetor(const float, const float); 00026 00027 00028 /* Operacoes comuns*/ 00029 00030 Vetor operator +(const Vetor); 00031 Vetor operator -(const Vetor); 00032 Vetor operator *(const Vetor); 00033 Vetor operator /(const Vetor); 00034 00035 Vetor operator +=(const Vetor); 00036 Vetor operator -=(const Vetor); 00037 Vetor operator *=(const Vetor); 00038 Vetor operator /=(const Vetor); 00039 00040 Vetor operator +(const TIPO); 00041 Vetor operator -(const TIPO); 00042 Vetor operator *(const TIPO); 00043 Vetor operator /(const TIPO); 00044 00045 Vetor operator +=(const TIPO); 00046 Vetor operator -=(const TIPO); 00047 Vetor operator *=(const TIPO); 00048 Vetor operator /=(const TIPO); 00049 Vetor operator =(const TIPO); 00050 00051 Vetor operator -(); 00052 00053 /* Operacoes de comparacao */ 00054 00055 bool operator ==(const Vetor); 00056 bool operator !=(const Vetor); 00057 00058 /* Opracoes avancadas */ 00059 00060 Vetor reduzir(); 00061 float modulo(); 00062 float distancia(Vetor); 00063 bool esquerda(Vetor, Vetor); 00064 }; 00065 00066 /* 00067 Classe Vetor : Implementacao 00068 00069 Encapsula a estrutura de dados e operacoes aplicaveis em um vetor bidimensional. 00070 00071 rodrigosetti@gmail.com 00072 */ 00073 00074 /* Construtores */ 00075 00076 template <class TIPO> 00077 Vetor<TIPO>::Vetor() 00078 { 00079 X = 0; 00080 Y = 0; 00081 } 00082 00083 template <class TIPO> 00084 Vetor<TIPO>::Vetor(float x, float y) 00085 { 00086 X = x; 00087 Y = y; 00088 } 00089 00090 /* Operacoes comuns*/ 00091 00092 #define OPERATOR_FUNC(op) \ 00093 template <class TIPO> \ 00094 Vetor<TIPO> inline Vetor<TIPO>::operator op(Vetor A)\ 00095 { \ 00096 return Vetor<TIPO>(X op A.X, Y op A.Y); \ 00097 } 00098 00099 OPERATOR_FUNC(+) 00100 OPERATOR_FUNC(-) 00101 OPERATOR_FUNC(*) 00102 OPERATOR_FUNC(/) 00103 OPERATOR_FUNC(+=) 00104 OPERATOR_FUNC(-=) 00105 OPERATOR_FUNC(*=) 00106 OPERATOR_FUNC(/=) 00107 00108 #undef OPERATOR_FUNC 00109 #define OPERATOR_FUNC(op) \ 00110 template <class TIPO> \ 00111 Vetor<TIPO> inline Vetor<TIPO>::operator op(TIPO c) \ 00112 { \ 00113 return Vetor<TIPO>(X op c, Y op c); \ 00114 } 00115 00116 OPERATOR_FUNC(+) 00117 OPERATOR_FUNC(-) 00118 OPERATOR_FUNC(*) 00119 OPERATOR_FUNC(/) 00120 OPERATOR_FUNC(+=) 00121 OPERATOR_FUNC(-=) 00122 OPERATOR_FUNC(*=) 00123 OPERATOR_FUNC(/=) 00124 OPERATOR_FUNC(=) 00125 00126 template <class TIPO> 00127 Vetor<TIPO> Vetor<TIPO>::operator -() 00128 { 00129 return Vetor<TIPO>(-X,-Y); 00130 } 00131 00132 /* Operacoes de comparacao */ 00133 00134 template <class TIPO> 00135 bool inline Vetor<TIPO>::operator ==(Vetor A) 00136 { 00137 return (X == A.X && Y == A.Y); 00138 } 00139 00140 template <class TIPO> 00141 bool inline Vetor<TIPO>::operator !=(Vetor A) 00142 { 00143 return (X != A.X || Y != A.Y); 00144 } 00145 00146 /* Operacoes avancadas */ 00147 00148 template <class TIPO> 00149 Vetor<TIPO> inline Vetor<TIPO>::reduzir() 00150 { 00151 return Vetor<TIPO>(X / sqrt((X*X)+(Y*Y)), Y / sqrt((X*X)+(Y*Y))); 00152 } 00153 00154 template <class TIPO> 00155 float inline Vetor<TIPO>::modulo() 00156 { 00157 return sqrt((X*X)+(Y*Y)); 00158 } 00159 00160 template <class TIPO> 00161 float inline Vetor<TIPO>::distancia(Vetor A) 00162 { 00163 return sqrt(((X - A.X)*(X - A.X)) + ((Y - A.Y)*(Y - A.Y))); 00164 } 00165 00166 00167 #endif /* #ifndef _VETOR__H */