00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00025
00027 static const cpVect cpvzero = {0.0f,0.0f};
00028
00030 static inline cpVect cpv(const cpFloat x, const cpFloat y)
00031 {
00032 cpVect v = {x, y};
00033 return v;
00034 }
00035
00037 cpFloat cpvlength(const cpVect v);
00038
00040 cpVect cpvslerp(const cpVect v1, const cpVect v2, const cpFloat t);
00041
00043 cpVect cpvslerpconst(const cpVect v1, const cpVect v2, const cpFloat a);
00044
00046 cpVect cpvforangle(const cpFloat a);
00047
00049 cpFloat cpvtoangle(const cpVect v);
00050
00054 char* cpvstr(const cpVect v);
00055
00057 static inline cpBool cpveql(const cpVect v1, const cpVect v2)
00058 {
00059 return (v1.x == v2.x && v1.y == v2.y);
00060 }
00061
00063 static inline cpVect cpvadd(const cpVect v1, const cpVect v2)
00064 {
00065 return cpv(v1.x + v2.x, v1.y + v2.y);
00066 }
00067
00069 static inline cpVect cpvsub(const cpVect v1, const cpVect v2)
00070 {
00071 return cpv(v1.x - v2.x, v1.y - v2.y);
00072 }
00073
00075 static inline cpVect cpvneg(const cpVect v)
00076 {
00077 return cpv(-v.x, -v.y);
00078 }
00079
00081 static inline cpVect cpvmult(const cpVect v, const cpFloat s)
00082 {
00083 return cpv(v.x*s, v.y*s);
00084 }
00085
00087 static inline cpFloat cpvdot(const cpVect v1, const cpVect v2)
00088 {
00089 return v1.x*v2.x + v1.y*v2.y;
00090 }
00091
00095 static inline cpFloat cpvcross(const cpVect v1, const cpVect v2)
00096 {
00097 return v1.x*v2.y - v1.y*v2.x;
00098 }
00099
00101 static inline cpVect cpvperp(const cpVect v)
00102 {
00103 return cpv(-v.y, v.x);
00104 }
00105
00107 static inline cpVect cpvrperp(const cpVect v)
00108 {
00109 return cpv(v.y, -v.x);
00110 }
00111
00113 static inline cpVect cpvproject(const cpVect v1, const cpVect v2)
00114 {
00115 return cpvmult(v2, cpvdot(v1, v2)/cpvdot(v2, v2));
00116 }
00117
00119 static inline cpVect cpvrotate(const cpVect v1, const cpVect v2)
00120 {
00121 return cpv(v1.x*v2.x - v1.y*v2.y, v1.x*v2.y + v1.y*v2.x);
00122 }
00123
00125 static inline cpVect cpvunrotate(const cpVect v1, const cpVect v2)
00126 {
00127 return cpv(v1.x*v2.x + v1.y*v2.y, v1.y*v2.x - v1.x*v2.y);
00128 }
00129
00131 static inline cpFloat cpvlengthsq(const cpVect v)
00132 {
00133 return cpvdot(v, v);
00134 }
00135
00137 static inline cpVect cpvlerp(const cpVect v1, const cpVect v2, const cpFloat t)
00138 {
00139 return cpvadd(cpvmult(v1, 1.0f - t), cpvmult(v2, t));
00140 }
00141
00143 static inline cpVect cpvnormalize(const cpVect v)
00144 {
00145 return cpvmult(v, 1.0f/cpvlength(v));
00146 }
00147
00149 static inline cpVect cpvnormalize_safe(const cpVect v)
00150 {
00151 return (v.x == 0.0f && v.y == 0.0f ? cpvzero : cpvnormalize(v));
00152 }
00153
00155 static inline cpVect cpvclamp(const cpVect v, const cpFloat len)
00156 {
00157 return (cpvdot(v,v) > len*len) ? cpvmult(cpvnormalize(v), len) : v;
00158 }
00159
00161 static inline cpVect cpvlerpconst(cpVect v1, cpVect v2, cpFloat d)
00162 {
00163 return cpvadd(v1, cpvclamp(cpvsub(v2, v1), d));
00164 }
00165
00167 static inline cpFloat cpvdist(const cpVect v1, const cpVect v2)
00168 {
00169 return cpvlength(cpvsub(v1, v2));
00170 }
00171
00173 static inline cpFloat cpvdistsq(const cpVect v1, const cpVect v2)
00174 {
00175 return cpvlengthsq(cpvsub(v1, v2));
00176 }
00177
00179 static inline cpBool cpvnear(const cpVect v1, const cpVect v2, const cpFloat dist)
00180 {
00181 return cpvdistsq(v1, v2) < dist*dist;
00182 }