00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
#ifndef _ZFXMATH_INCLUDE_VECTOR2D_H_
00015
#define _ZFXMATH_INCLUDE_VECTOR2D_H_
00016
00017
namespace ZFXMath
00018 {
00019
00020
template<
typename T>
00021
struct TVector3D;
00022
template<
typename T>
00023
struct TVector4D;
00024
00034
template<
typename T>
00035 struct TVector2D
00036 {
00037
union
00038
{
00039 T val[2];
00040
struct
00041
{
00042 T x, y;
00043 };
00044
struct
00045
{
00046 T u, v;
00047 };
00048 };
00049
00050
TVector2D() {};
00051
00052
TVector2D(
const T& _x,
const T& _y ) { x=_x; y=_y; }
00053
00054
TVector2D(
const T* pV ) { x = pV[0]; y = pV[1]; }
00055
TVector2D(
const T& val ) { x = y = val; }
00056
TVector2D(
const TVector2D& v ) { x = v.
x; y = v.
y; }
00057
TVector2D(
const TVector3D<T>& v ) { x = v.
x; y = v.
y; }
00058
TVector2D(
const TVector4D<T>& v ) { x = v.x; y = v.y; }
00059
00060
00066 operator T* () {
return val; }
00067 operator const T* ()
const {
return val; }
00068
00074 T
operator () (
const int i )
const
00075
{
00076
return val[ Check( i ) ];
00077 }
00078
00084 T&
operator () (
const int i )
00085 {
00086
return val[ Check( i ) ];
00087 }
00088
00094 TVector2D&
operator = (
const T& val ) { x = y = val;
return *
this; }
00095
TVector2D& operator += (
const TVector2D& v ) { x += v.
x; y += v.
y;
return *
this; }
00096 TVector2D& operator -= (
const TVector2D& v ) { x -= v.x; y -= v.y;
return *
this; }
00097 TVector2D&
operator *= (
const TVector2D& v ) { x *= v.x; y *= v.y;
return *
this; }
00098 TVector2D& operator /= (
const TVector2D& v ) { x /= v.x; y /= v.y;
return *
this; }
00099
00105 TVector2D&
operator *= (
const T& v ) { x *= v; y *= v;
return *
this; }
00106
TVector2D& operator /= (
const T& v ) { x /= v; y /= v;
return *
this; }
00107
00113 TVector2D operator + ()
const {
return *
this; }
00114
TVector2D operator - ()
const {
return TVector2D( -x, -y ); }
00115
00121 TVector2D operator + (
const TVector2D& v )
const {
return TVector2D( x + v.
x, y + v.
y ); }
00122
TVector2D operator - (
const TVector2D& v )
const {
return TVector2D( x - v.
x, y - v.
y ); }
00123 TVector2D operator * (
const TVector2D& v )
const {
return TVector2D( x * v.x, y * v.y ); }
00124 TVector2D operator / (
const TVector2D& v )
const {
return TVector2D( x / v.x, y / v.y ); }
00125 TVector2D operator * (
const T& v )
const {
return TVector2D( x * v, y * v ); }
00126 TVector2D operator / (
const T& v )
const {
return TVector2D( x / v, y / v ); }
00127
friend TVector2D<T> operator * (
const T& val,
const TVector2D<T>& vec )
00128 {
return (TVector2D) ( vec.x * val, vec.y * val ); }
00129
00135 T
LengthSqr()
00136 {
00137
return DotProduct( *
this );
00138 };
00139
00145 T
Length()
00146 {
00147
return Sqrt(
LengthSqr() );
00148 };
00149
00161 void Normalize()
00162 {
00163 (*this) /=
Length();
00164 };
00165
00171 T
DotProduct(
const TVector2D& v )
const {
return v.
x * x + v.
y * y; }
00172
00182 TVector2D Reflect(
const TVector2D& n )
const
00183
{
00184
return TVector2D( (*
this) - 2 *
DotProduct( n ) * n );
00185 }
00186
00198 TVector2D Refract(
const TVector2D& n,
const T& ri )
const
00199
{
00200
return Interpolate( (*
this), n, 1 - ri ).Normalize();
00201 }
00202
00203
private:
00204
inline int Check(
const int index )
const
00205
{
00206
00207 assert( index >= 0 && index < 2 );
00208
00209
return (index);
00210 }
00211 };
00212 }
00213
00214
#endif //_ZFXMATH_INCLUDE_VECTOR2D_H_
00215
00216
00217
00218