/// @Desc :  Class represents Triangle .
/// @Package: Core


class Triangle<T>
{
public:
 
	/// triangle points
	Point2D<T> p1, p2, p3;
  	///----------------------------------------------------
	/// Constructors 
	///----------------------------------------------------
	
	
	
	
	
	///----------------------------------------------------
	/// Triangle Methods
	///----------------------------------------------------
	
	
	/// get current triangle area
	T getArea();
 
	/// check if passed point is fall in current triangle
	/// return true if it is, otherwise false
	
	boolean IsPointInTringle([IN] Point2D<T> p) const;
 
	/// get Triangle center point
	/// in physics called center of gravity
	/// return Point2D object.
	Point2D<T> getCenterPoint();	
 
	/// get angle between two lines of current triangle
	/// pass triangle points in various way to get your desire angle
	/// return the angle in success, otherwise -1 if faild
	float getAngleBetween ( Point2D<T> line1_End_point, Point2D<T> Line2_End_point, 
				Point2D<T> intersect_point );
 
	/// check if current triangle is valid triangle
	/// return true if it is, otherwise false
	boolean isValid();
 
	/// get rectangle that contain current triangle
	/// return rectangle object.
	Rectangle<T> getBoundRect();
 
	/// get circle that contain current triangle
	/// return circle object, otherwise null
	Circle<T> getBoundCircle() ;
 
  	///----------------------------------------------------
	/// the following methods become:
	/// - Operators in C++ .
	///	- Normal methods in Java
	///----------------------------------------------------
 
	boolean equals   ( [IN] Triangle<T> p );
	/// you can ignore it in java version .. 
	/// in c++ version it will become != .
	boolean Notequal( [IN] Triangle<T> p );
};