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