00001 #ifndef H_MYTRITRI 00002 #define H_MYTRITRI 00003 00004 #include "box.h" 00005 00008 Vector3D my_tri_tri_intersect(const Triangle& t1, const Triangle& t2); 00009 00012 class TriangleDesc : public Triangle 00013 { 00014 public: 00015 TriangleDesc(const Triangle& t, const Plane& p) 00016 : Triangle(t) 00017 { 00018 const Vector3D& n=p.normal; 00019 Vector3D a(flabs(n.x),flabs(n.y),flabs(n.z)); 00020 if (a.x>a.y) 00021 { 00022 if (a.x>a.z) { i1=1; i2=2; } 00023 else { i1=0; i2=1; } 00024 } 00025 else 00026 { 00027 if (a.y>a.z) { i1=0; i2=2; } 00028 else { i1=0; i2=1; } 00029 } 00030 } 00031 00032 bool pointInTri(const Vector3D& P) 00033 { 00034 Vector3D u(P[i1]-v1[i1], 00035 v2[i1]-v1[i1], 00036 v3[i1]-v1[i1]); 00037 Vector3D v(P[i2]-v1[i2], 00038 v2[i2]-v1[i2], 00039 v3[i2]-v1[i2]); 00040 float a,b; 00041 if (u.y==0.0f) 00042 { 00043 b=u.x/u.z; 00044 if (b>=0.0f && b<=1.0f) a=(v.x-b*v.z)/v.y; 00045 else return false; 00046 } 00047 else 00048 { 00049 b=(v.x*u.y-u.x*v.y)/(v.z*u.y-u.z*v.y); 00050 if (b>=0.0f && b<=1.0f) a=(u.x-b*u.z)/u.y; 00051 else return false; 00052 } 00053 return (a>=0 && (a+b)<=1); 00054 } 00055 00056 const Vector3D& operator[] (int index) 00057 { 00058 switch (index) 00059 { 00060 case 0: return v1; 00061 case 1: return v2; 00062 case 2: return v3; 00063 case 3: return v1; 00064 } 00065 return v2; 00066 } 00067 00068 int i1,i2; 00069 }; 00070 00071 00072 00073 #endif // H_MYTRITRI