Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef VECTOR2_H
00024 #define VECTOR2_H
00025
00026 #include <math.h>
00027
00028 template <typename T>
00029 struct Vector2
00030 {
00031 T x, y;
00032
00033
00034 Vector2<T>() {memset(this, 0, sizeof(*this));}
00035
00036
00037 Vector2<T>(const T x0, const T y0): x(x0), y(y0) {}
00038
00039
00040 void operator ()(const T x0, const T y0)
00041 { x= x0; y= y0; }
00042
00043
00044 bool operator==(const Vector2<T> &v)
00045 { return (x==v.x && y==v.y); }
00046
00047
00048 bool operator!=(const Vector2<T> &v)
00049 { return (x!=v.x || y!=v.y); }
00050
00051
00052 Vector2<T> operator -(void) const
00053 { return Vector2<T>(-x, -y); }
00054
00055
00056 Vector2<T> operator +(const Vector2<T> &v) const
00057 { return Vector2<T>(x+v.x, y+v.y); }
00058
00059
00060 Vector2<T> operator -(const Vector2<T> &v) const
00061 { return Vector2<T>(x-v.x, y-v.y); }
00062
00063
00064 Vector2<T> operator *(const T num) const
00065 {
00066 Vector2<T> temp(*this);
00067 return temp*=num;
00068 }
00069
00070
00071 Vector2<T> operator /(const T num) const
00072 {
00073 Vector2<T> temp(*this);
00074 return temp/=num;
00075 }
00076
00077
00078 Vector2<T> &operator +=(const Vector2<T> &v)
00079 {
00080 x+=v.x; y+=v.y;
00081 return *this;
00082 }
00083
00084
00085 Vector2<T> &operator -=(const Vector2<T> &v)
00086 {
00087 x-=v.x; y-=v.y;
00088 return *this;
00089 }
00090
00091
00092 Vector2<T> &operator *=(const T num)
00093 {
00094 x*=num; y*=num;
00095 return *this;
00096 }
00097
00098
00099 Vector2<T> &operator /=(const T num)
00100 {
00101 x/=num; y/=num;
00102 return *this;
00103 }
00104
00105
00106 T operator *(const Vector2<T> &v) const
00107 { return x*v.x + y*v.y; }
00108
00109
00110 T length_squared() const
00111 { return (T)(*this * *this); }
00112
00113
00114 T length() const
00115 { return (T)sqrt(*this * *this); }
00116
00117
00118 void normalize()
00119 { *this/=length(); }
00120
00121
00122 Vector2<T> normalized() const
00123 { return *this/length(); }
00124
00125
00126 void reflect(const Vector2<T> &n)
00127 {
00128 Vector2<T> orig(*this);
00129 project(n);
00130 *this= *this*2 - orig;
00131 }
00132
00133
00134 void project(const Vector2<T> &v)
00135 { *this= v * (*this * v)/(v*v); }
00136
00137
00138 Vector2<T> projected(const Vector2<T> &v)
00139 { return v * (*this * v)/(v*v); }
00140
00141
00142 T angle(const Vector2<T> &v1, const Vector2<T> &v2)
00143 { return (T)acosf((v1*v2) / (v1.length()*v2.length())); }
00144
00145
00146 T angle_normalized(const Vector2<T> &v1, const Vector2<T> &v2)
00147 { return (T)acosf(v1*v2); }
00148
00149 };
00150
00151 typedef Vector2<int> Vector2i;
00152 typedef Vector2<unsigned int> Vector2ui;
00153 typedef Vector2<long> Vector2l;
00154 typedef Vector2<unsigned long> Vector2ul;
00155 typedef Vector2<float> Vector2f;
00156
00157 #endif // VECTOR2_H