00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef _triangle_h_
00027 #define _triangle_h_
00028
00029 #include <vector>
00030
00031 #include "matvec3D.h"
00032 #include "mytools.h"
00034 class Triangle {
00035 public:
00036 position v1,v2,v3;
00037
00038 Triangle(const position &nv1, const position &nv2, const position &nv3) : v1(nv1), v2(nv2), v3(nv3) {}
00039 Triangle(const Triangle &t) : v1(t.v1), v2(t.v2), v3(t.v3) {}
00040 inline void applyTransform(const transf &t);
00041 inline double area() const;
00042 inline position centroid() const;
00043 inline vec3 normal() const;
00044
00045 friend inline bool triangleIntersection(const Triangle &t1, const Triangle &t2);
00046 };
00047
00048 INLINE_RELEASE bool
00049 triangleIntersection(const Triangle &t1, const Triangle &t2);
00050
00051 INLINE_RELEASE position
00052 closestPtTriangle(const Triangle &t, const position &p);
00053
00055 INLINE_RELEASE double
00056 triangleTriangleDistanceSq(const Triangle &t1, const Triangle &t2,
00057 position &p1, position &p2);
00058
00060 INLINE_RELEASE int
00061 triangleTriangleContact(const Triangle &t1, const Triangle &t2, double threshSq,
00062 std::vector< std::pair<position, position> >* contactPoints);
00063
00064 double
00065 Triangle::area() const
00066 {
00067 return 0.5 * ((v2 - v1) * (v3 - v1)).len();
00068 }
00069
00070 vec3
00071 Triangle::normal() const
00072 {
00073 return normalise( (v2 - v1) * (v3 - v1) );
00074 }
00075
00076 position
00077 Triangle::centroid() const
00078 {
00079 return (1.0 / 3.0) * (v1 + v2 + v3);
00080 }
00081
00082 void
00083 Triangle::applyTransform(const transf &t)
00084 {
00085 v1 = v1*t;
00086 v2 = v2*t;
00087 v3 = v3*t;
00088 }
00089
00090 #ifdef GRASPIT_RELEASE
00091 #include "triangle_inl.h"
00092 #endif
00093
00094 #endif