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

class Circle<T>
{
public:
	/// center point of circle
	/// also it is the center of gravity
	/// because this type represent a perfect circle
	Point2D<T> center;
	/// circle radius
	T          Radius;
 
 	///----------------------------------------------------
	/// Constructors 
	///----------------------------------------------------
	
	
	
	
	
	///----------------------------------------------------
	/// Circle Methods
	///----------------------------------------------------
	
	
	/// @Purpose: check if passed point is fall in current circle (circle edges are part of circle)
	/// @Return : true if it is, false otherwise
	boolean isPointInCircle( [IN] Point2D<T> point );
 
	/// @Purpose: check if passed line touch the circle edge in one point
	/// @Return : return true if it is, false otherwise
	boolean isLineTangent ( Line2D<T> line );
 
	/// @Purpose: check if passed line is intersect current circle in any point
	/// @Return : return true if it is, false otherwise
	boolean IsLineIntersect ( Line2D<T> line );
 
	/// @Purpose: get intersect points if intersection exist
	/// @Return : array of 2 or 1 point(s) depend on intersection
	/// otherwise null array
	Point2D<T>[] getIntersectPoint ( Line2D<T> line );
 
	/// return circle circumference
	float getCircumference();
	/// return circle area
	float getArea();
 
	/// get rectangle that contains current circle
	/// because of the circle is always a prefect
	/// circle that output object always a square
	///
	/// return rectangle object
	Rectangle<T> getBoundRect();
 
 
 	///----------------------------------------------------
	/// the following methods become:
	/// - Operators in C++ .
	///	- Normal methods in Java
	///----------------------------------------------------
 
	boolean equals   ( [IN] Circle<T> other );
	/// you can ignore it in java version .. 
	/// in c++ version it will become != .
	boolean Notequal( [IN] Circle<T> other );
};