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 cpVect cpvslerp(const cpVect v1, const cpVect v2, const cpFloat t);
00038
00040 cpVect cpvslerpconst(const cpVect v1, const cpVect v2, const cpFloat a);
00041
00045 char* cpvstr(const cpVect v);
00046
00048 static inline cpBool cpveql(const cpVect v1, const cpVect v2)
00049 {
00050 return (v1.x == v2.x && v1.y == v2.y);
00051 }
00052
00054 static inline cpVect cpvadd(const cpVect v1, const cpVect v2)
00055 {
00056 return cpv(v1.x + v2.x, v1.y + v2.y);
00057 }
00058
00060 static inline cpVect cpvsub(const cpVect v1, const cpVect v2)
00061 {
00062 return cpv(v1.x - v2.x, v1.y - v2.y);
00063 }
00064
00066 static inline cpVect cpvneg(const cpVect v)
00067 {
00068 return cpv(-v.x, -v.y);
00069 }
00070
00072 static inline cpVect cpvmult(const cpVect v, const cpFloat s)
00073 {
00074 return cpv(v.x*s, v.y*s);
00075 }
00076
00078 static inline cpFloat cpvdot(const cpVect v1, const cpVect v2)
00079 {
00080 return v1.x*v2.x + v1.y*v2.y;
00081 }
00082
00086 static inline cpFloat cpvcross(const cpVect v1, const cpVect v2)
00087 {
00088 return v1.x*v2.y - v1.y*v2.x;
00089 }
00090
00092 static inline cpVect cpvperp(const cpVect v)
00093 {
00094 return cpv(-v.y, v.x);
00095 }
00096
00098 static inline cpVect cpvrperp(const cpVect v)
00099 {
00100 return cpv(v.y, -v.x);
00101 }
00102
00104 static inline cpVect cpvproject(const cpVect v1, const cpVect v2)
00105 {
00106 return cpvmult(v2, cpvdot(v1, v2)/cpvdot(v2, v2));
00107 }
00108
00110 static inline cpVect cpvforangle(const cpFloat a)
00111 {
00112 return cpv(cpfcos(a), cpfsin(a));
00113 }
00114
00116 static inline cpFloat cpvtoangle(const cpVect v)
00117 {
00118 return cpfatan2(v.y, v.x);
00119 }
00120
00122 static inline cpVect cpvrotate(const cpVect v1, const cpVect v2)
00123 {
00124 return cpv(v1.x*v2.x - v1.y*v2.y, v1.x*v2.y + v1.y*v2.x);
00125 }
00126
00128 static inline cpVect cpvunrotate(const cpVect v1, const cpVect v2)
00129 {
00130 return cpv(v1.x*v2.x + v1.y*v2.y, v1.y*v2.x - v1.x*v2.y);
00131 }
00132
00134 static inline cpFloat cpvlengthsq(const cpVect v)
00135 {
00136 return cpvdot(v, v);
00137 }
00138
00140 static inline cpFloat cpvlength(const cpVect v)
00141 {
00142 return cpfsqrt(cpvdot(v, v));
00143 }
00144
00146 static inline cpVect cpvlerp(const cpVect v1, const cpVect v2, const cpFloat t)
00147 {
00148 return cpvadd(cpvmult(v1, 1.0f - t), cpvmult(v2, t));
00149 }
00150
00152 static inline cpVect cpvnormalize(const cpVect v)
00153 {
00154 return cpvmult(v, 1.0f/cpvlength(v));
00155 }
00156
00158 static inline cpVect cpvnormalize_safe(const cpVect v)
00159 {
00160 return (v.x == 0.0f && v.y == 0.0f ? cpvzero : cpvnormalize(v));
00161 }
00162
00164 static inline cpVect cpvclamp(const cpVect v, const cpFloat len)
00165 {
00166 return (cpvdot(v,v) > len*len) ? cpvmult(cpvnormalize(v), len) : v;
00167 }
00168
00170 static inline cpVect cpvlerpconst(cpVect v1, cpVect v2, cpFloat d)
00171 {
00172 return cpvadd(v1, cpvclamp(cpvsub(v2, v1), d));
00173 }
00174
00176 static inline cpFloat cpvdist(const cpVect v1, const cpVect v2)
00177 {
00178 return cpvlength(cpvsub(v1, v2));
00179 }
00180
00182 static inline cpFloat cpvdistsq(const cpVect v1, const cpVect v2)
00183 {
00184 return cpvlengthsq(cpvsub(v1, v2));
00185 }
00186
00188 static inline cpBool cpvnear(const cpVect v1, const cpVect v2, const cpFloat dist)
00189 {
00190 return cpvdistsq(v1, v2) < dist*dist;
00191 }
00192
00194
00198
00199 static inline cpMat2x2
00200 cpMat2x2New(cpFloat a, cpFloat b, cpFloat c, cpFloat d)
00201 {
00202 cpMat2x2 m = {a, b, c, d};
00203 return m;
00204 }
00205
00206 static inline cpVect
00207 cpMat2x2Transform(cpMat2x2 m, cpVect v)
00208 {
00209 return cpv(v.x*m.a + v.y*m.b, v.x*m.c + v.y*m.d);
00210 }
00211