00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef GEOM_VECMAT2_OP_HH
00020 #define GEOM_VECMAT2_OP_HH
00021
00022 #include "constants.hh"
00023
00024 #include <ost/geom/module_config.hh>
00025
00026 #include <ost/geom/vec2.hh>
00027 #include <ost/geom/mat2.hh>
00028
00029 namespace geom {
00030
00031 class Vec2;
00032 class Mat2;
00033
00035 inline Real Length2(const Vec2& v)
00036 {
00037 return v[0]*v[0]+v[1]*v[1];
00038 }
00039
00041 inline Real Length(const Vec2& v)
00042 {
00043 return std::sqrt(Length2(v));
00044 }
00045
00047 inline bool Equal(const Vec2& v1, const Vec2& v2, Real ephilon=EPSILON)
00048 {
00049 return std::fabs(v1[0]-v2[0])<ephilon &&
00050 std::fabs(v1[1]-v2[1])<ephilon;
00051 }
00052
00054 inline bool Equal(const Mat2& m1, const Mat2& m2, Real ephilon=EPSILON)
00055 {
00056 return std::fabs(m1(0,0)-m2(0,0))<ephilon &&
00057 std::fabs(m1(0,1)-m2(0,1))<ephilon &&
00058 std::fabs(m1(1,0)-m2(1,0))<ephilon &&
00059 std::fabs(m1(1,1)-m2(1,1))<ephilon;
00060 }
00061
00063 inline Real Dot(const Vec2& v1, const Vec2& v2)
00064 {
00065 return v1[0]*v2[0]+v1[1]*v2[1];
00066 }
00067
00069 inline Vec2 Normalize(const Vec2& v)
00070 {
00071 Real l=Length(v);
00072 if(l==0.0) {
00073 return v;
00074 }
00075 return v/l;
00076 }
00077
00079 inline Vec2 CompMultiply(const Vec2& v1, const Vec2& v2)
00080 {
00081 Vec2 nrvo(v1[0]*v2[0],v1[1]*v2[1]);
00082 return nrvo;
00083 }
00084
00086 inline Vec2 CompDivide(const Vec2& v1, const Vec2& v2)
00087 {
00088 Vec2 nrvo(v1[0]/v2[0],v1[1]/v2[1]);
00089 return nrvo;
00090 }
00091
00093
00099 inline Vec2 operator*(const Vec2& v,const Mat2& m)
00100 {
00101 Vec2 nrvo(v[0]*m(0,0)+v[1]*m(1,0),
00102 v[0]*m(0,1)+v[1]*m(1,1));
00103 return nrvo;
00104 }
00105
00107
00113 inline Vec2 operator*(const Mat2& m, const Vec2& v)
00114 {
00115 Vec2 nrvo(v[0]*m(0,0)+v[1]*m(0,1),
00116 v[0]*m(1,0)+v[1]*m(1,1));
00117 return nrvo;
00118 }
00119
00121 Real DLLEXPORT_OST_GEOM Det(const Mat2& m);
00123 Mat2 DLLEXPORT_OST_GEOM Transpose(const Mat2& m);
00124
00126 Mat2 DLLEXPORT_OST_GEOM Invert(const Mat2& m);
00127
00129 Real DLLEXPORT_OST_GEOM Angle(const Vec2& v1, const Vec2& v2);
00131 Real DLLEXPORT_OST_GEOM SignedAngle(const Vec2& v1, const Vec2& v2);
00132
00134 inline Mat2 operator*(const Mat2& m1, const Mat2& m2)
00135 {
00136 Mat2 nrvo(m1(0,0)*m2(0,0)+m1(0,1)*m2(1,0),
00137 m1(0,0)*m2(0,1)+m1(0,1)*m2(1,1),
00138 m1(1,0)*m2(0,0)+m1(1,1)*m2(1,0),
00139 m1(1,0)*m2(0,1)+m1(1,1)*m2(1,1));
00140 return nrvo;
00141 }
00142
00143 inline Vec2 Min(const Vec2& v1, const Vec2& v2)
00144 {
00145 Vec2 nrvo(std::min(v1[0],v2[0]),
00146 std::min(v1[1],v2[1]));
00147 return nrvo;
00148 }
00149
00150 inline Vec2 Max(const Vec2& v1, const Vec2& v2)
00151 {
00152 Vec2 nrvo(std::max(v1[0],v2[0]),
00153 std::max(v1[1],v2[1]));
00154 return nrvo;
00155 }
00156
00158 DLLEXPORT Vec2 Rotate(const Vec2& v,Real ang);
00159
00160 }
00161
00162 #endif