/***********************************************************************************************
	Collision checkers
************************************************************************************************/
bool CollisionManager::isIntersectsPointCircle(ICollisionHull* point, ICollisionHull* circle)
{
    PointCollisionHull* pointCH = dynamic_cast<PointCollisionHull*>(point);
    CircleCollisionHull* circleCH = dynamic_cast<CircleCollisionHull*>(circle);

    Vector3 dv = pointCH->getPosition() - circleCH->getPosition();
    float distance = dv.length();

    return (distance <= circleCH->getRadius());
}
	bool Intersections::isIntersectsCirclePolygon(ICollisionHull* circle, ICollisionHull* polygon)
	{
		CircleCollisionHull* circleCH = dynamic_cast<CircleCollisionHull*>(circle);
		PoligonCollisionHull* poligonCH = dynamic_cast<PoligonCollisionHull*>(polygon);
		Vector3 position = circleCH->getPosition();
		Vector3 dotPosition = position;
		dotPosition._z = 1.0f;

		float radius = circleCH->getRadius();
		IPhysics::PointList points = poligonCH->getPoints();

		for(int i = 0; i < points.size(); i++)
		{
			Vector3 vDistance = position - points[i];
			float distance = vDistance.length();
			if(distance < radius)
			{
				return true;
			}

			Vector3 p1 = points[i];
			Vector3 p2 = (i == points.size() - 1) ? points[0] : points[i + 1];

			Vector3 line;
			line._x = p1._y - p2._y; //A
			line._y = p2._x - p1._x; //B
			line._z = p1._x * (p2._y - p1._y) - p1._y * (p2._x - p1._x); //C

			Vector3 line2(line._x, line._y, 0.0f);
			float denominator = line2.length();
			if(denominator == 0.0f) denominator = 1.0f;

			float deviation = line.dotProduct(dotPosition);
			deviation = std::abs(deviation) / denominator;
			if(deviation < radius)
			{
				Vector3 v1 = position - p1;
				Vector3 v2 = position - p2;
				Vector3 l0 = p1 - p2;

				float dot1 = l0.dotProduct(v1);
				float dot2 = l0.dotProduct(v2);
				if((dot1 * dot2) <= 0.0f)
				{
					return true;
				}
			}
		}

		return false;
	}
bool CollisionManager::isIntersectsCirclePolygon(ICollisionHull* circle, ICollisionHull* polygon)
{
    CircleCollisionHull* circleCH = dynamic_cast<CircleCollisionHull*>(circle);
    PoligonCollisionHull* poligonCH = dynamic_cast<PoligonCollisionHull*>(polygon);

    Vector3 position = circleCH->getPosition();
    float radius = circleCH->getRadius();
    PointList points = poligonCH->getPoints();

    Vector3 dv;
    float distance;
    for(int i = 0; i < points.size(); i++)
    {
        dv = position - points[i];
        distance = dv.length();
        if(distance <= radius)
        {
            return true;
        }
    }

    return false;
}