/*********************************************************************************************** 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; }