1 #ifndef VECTOR_H
2 #define VECTOR_H
3 
4 #include <math.h>
5 
6 #include <stdio.h>
7 
8 enum zero_t {zero};
9 
10 class Vector
11 {
12 	public:
Vector()13 		Vector(){}
Vector(const zero_t)14 		Vector(const zero_t):x(0),y(0){}
Vector(const float ax,const float ay)15 		Vector(const float ax,const float ay):x(ax),y(ay){}
Vector(const Vector & v)16 		Vector(const Vector &v):x(v.x),y(v.y){}
17 
scale_x()18 		float scale_x()const{return x;}
scale_y()19 		float scale_y()const{return y;}
20 
set(const float ax,const float ay)21 		void set(const float ax,const float ay){x=ax;y=ay;}
22 
23 		Vector operator+(const Vector &v)const{return Vector(x+v.x,y+v.y);}
24 		Vector operator-(const Vector &v)const{return Vector(x-v.x,y-v.y);}
25 		bool operator==(const Vector &v)const{return (x==v.x)&&(y==v.y);}
26 		bool operator!=(const Vector &v)const{return (x!=v.x)||(y!=v.y);}
27 
module()28 		float module()const{return sqrt(x*x+y*y);}
angle()29 		float angle()const{return atan2(y,x);}
30 
imprime()31 		void imprime()const{printf("x: %f\ny: %f\n",x,y);}
32 	private:
33 		float x,y;
34 };
35 
add(const Vector & a,const Vector & b)36 inline Vector add(const Vector &a,const Vector &b)
37 {
38 	return Vector(a.scale_x()+b.scale_x(),a.scale_y()+b.scale_y());
39 }
40 
sub(const Vector & a,const Vector & b)41 inline Vector sub(const Vector &a,const Vector &b)
42 {
43 	return Vector(a.scale_x()-b.scale_x(),a.scale_y()-b.scale_y());
44 }
45 
escalate(const Vector & a,const Vector & b)46 inline float escalate(const Vector &a,const Vector &b)
47 {
48 	return a.scale_x()*b.scale_x()+a.scale_y()*b.scale_y();
49 }
50 
multiply(const Vector & v,const float & k)51 inline Vector multiply(const Vector &v,const float &k)
52 {
53 	return Vector(v.scale_x()*k,v.scale_y()*k);
54 }
55 
multiply(const float & k,const Vector & v)56 inline Vector multiply(const float &k,const Vector &v)
57 {
58 	return multiply(v,k);
59 }
60 
normalize(const Vector & v)61 inline Vector normalize(const Vector &v)
62 {
63 	return Vector(v.scale_x()/v.module(),v.scale_y()/v.module());
64 }
65 
reflect(const Vector & v,const Vector & n)66 inline Vector reflect(const Vector &v,const Vector &n)
67 {
68 	Vector aux=normalize(n);
69 	float proyection=escalate(v,aux);
70 	aux=multiply(proyection,aux);
71 	Vector resta=sub(aux,v);
72 	return add(v,multiply(2,resta));
73 }
74 
reverse(const Vector & v)75 inline Vector reverse(const Vector &v)
76 {
77 	return multiply(-1,v);
78 }
79 
rotateRight(const Vector & v)80 inline Vector rotateRight(const Vector &v)
81 {
82 	return Vector(-v.scale_y(),v.scale_x());
83 }
84 
rotateLeft(const Vector & v)85 inline Vector rotateLeft(const Vector &v)
86 {
87 	return Vector(v.scale_y(),-v.scale_x());
88 }
89 /*
90 inline Vector add(const Vector,const Vector)const;
91 inline Vector sub(const Vector,const Vector)const;
92 inline float escalate(const Vector,const Vector)const;
93 inline Vector multiply(const Vector,const float)const;
94 inline Vector multiply(const float,const Vector)const;
95 inline Vector normalize(const Vector)const;
96 Vector reflect(const Vector,const Vector)const;
97 */
98 
99 #endif
100