00001
00032 #include "linden_common.h"
00033
00034
00035 #include "v2math.h"
00036 #include "v4math.h"
00037 #include "m4math.h"
00038 #include "m3math.h"
00039 #include "llquaternion.h"
00040
00041
00042
00043 LLVector2 LLVector2::zero(0,0);
00044
00045
00046
00047
00048
00049
00050 BOOL LLVector2::abs()
00051 {
00052 BOOL ret = FALSE;
00053
00054 if (mV[0] < 0.f) { mV[0] = -mV[0]; ret = TRUE; }
00055 if (mV[1] < 0.f) { mV[1] = -mV[1]; ret = TRUE; }
00056
00057 return ret;
00058 }
00059
00060
00061 F32 angle_between(const LLVector2& a, const LLVector2& b)
00062 {
00063 LLVector2 an = a;
00064 LLVector2 bn = b;
00065 an.normVec();
00066 bn.normVec();
00067 F32 cosine = an * bn;
00068 F32 angle = (cosine >= 1.0f) ? 0.0f :
00069 (cosine <= -1.0f) ? F_PI :
00070 acos(cosine);
00071 return angle;
00072 }
00073
00074 BOOL are_parallel(const LLVector2 &a, const LLVector2 &b, float epsilon)
00075 {
00076 LLVector2 an = a;
00077 LLVector2 bn = b;
00078 an.normVec();
00079 bn.normVec();
00080 F32 dot = an * bn;
00081 if ( (1.0f - fabs(dot)) < epsilon)
00082 {
00083 return TRUE;
00084 }
00085 return FALSE;
00086 }
00087
00088
00089 F32 dist_vec(const LLVector2 &a, const LLVector2 &b)
00090 {
00091 F32 x = a.mV[0] - b.mV[0];
00092 F32 y = a.mV[1] - b.mV[1];
00093 return fsqrtf( x*x + y*y );
00094 }
00095
00096 F32 dist_vec_squared(const LLVector2 &a, const LLVector2 &b)
00097 {
00098 F32 x = a.mV[0] - b.mV[0];
00099 F32 y = a.mV[1] - b.mV[1];
00100 return x*x + y*y;
00101 }
00102
00103 F32 dist_vec_squared2D(const LLVector2 &a, const LLVector2 &b)
00104 {
00105 F32 x = a.mV[0] - b.mV[0];
00106 F32 y = a.mV[1] - b.mV[1];
00107 return x*x + y*y;
00108 }
00109
00110 LLVector2 lerp(const LLVector2 &a, const LLVector2 &b, F32 u)
00111 {
00112 return LLVector2(
00113 a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u,
00114 a.mV[VY] + (b.mV[VY] - a.mV[VY]) * u );
00115 }