1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2 /**
3  *	Contains a handy triangle class.
4  *	\file		IceTriangle.h
5  *	\author		Pierre Terdiman
6  *	\date		January, 17, 2000
7  */
8 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
9 
10 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
11 // Include Guard
12 #ifndef __ICETRIANGLE_H__
13 #define __ICETRIANGLE_H__
14 
15 	// Forward declarations
16 	class Moment;
17 
18 	// Partitioning values
19 	enum PartVal
20 	{
21 		TRI_MINUS_SPACE		= 0,			//!< Triangle is in the negative space
22 		TRI_PLUS_SPACE		= 1,			//!< Triangle is in the positive space
23 		TRI_INTERSECT		= 2,			//!< Triangle intersects plane
24 		TRI_ON_PLANE		= 3,			//!< Triangle and plane are coplanar
25 
26 		TRI_FORCEDWORD		= 0x7fffffff
27 	};
28 
29 	// A triangle class.
30 	class ICEMATHS_API Triangle
31 	{
32 		public:
33 		//! Constructor
Triangle()34 		inline_					Triangle()													{}
35 		//! Constructor
Triangle(const Point & p0,const Point & p1,const Point & p2)36 		inline_					Triangle(const Point& p0, const Point& p1, const Point& p2)	{ mVerts[0]=p0; mVerts[1]=p1; mVerts[2]=p2; }
37 		//! Copy constructor
Triangle(const Triangle & triangle)38 		inline_					Triangle(const Triangle& triangle)
39 								{
40 									mVerts[0] = triangle.mVerts[0];
41 									mVerts[1] = triangle.mVerts[1];
42 									mVerts[2] = triangle.mVerts[2];
43 								}
44 		//! Destructor
~Triangle()45 		inline_					~Triangle()													{}
46 		//! Vertices
47 				Point			mVerts[3];
48 
49 		// Methods
50 				void			Flip();
51 				float			Area() const;
52 				float			Perimeter()	const;
53 				float			Compacity()	const;
54 				void			Normal(Point& normal) const;
55 				void			DenormalizedNormal(Point& normal) const;
56 				void			Center(Point& center) const;
PlaneEquation()57 		inline_	Plane			PlaneEquation() const	{ return Plane(mVerts[0], mVerts[1], mVerts[2]);	}
58 
59 				PartVal			TestAgainstPlane(const Plane& plane, float epsilon) const;
60 //				float			Distance(Point& cp, Point& cq, Tri& tri);
61 				void			ComputeMoment(Moment& m);
62 				float			MinEdgeLength() const;
63 				float			MaxEdgeLength() const;
64 				void			ComputePoint(float u, float v, Point& pt, udword* nearvtx=null)	const;
65 				void			Inflate(float fat_coeff, bool constant_border);
66 	};
67 
68 #endif // __ICETRIANGLE_H__
69