bool CollisionManager::isIntersectsPointPolygon(ICollisionHull* point, ICollisionHull* polygon) { PointCollisionHull* pointCH = dynamic_cast<PointCollisionHull*>(point); PoligonCollisionHull* poligonCH = dynamic_cast<PoligonCollisionHull*>(polygon); Vector3 position = pointCH->getPosition(); PointList points = poligonCH->getPoints(); int i0, i1; float A, B, C, D; Vector3 P0, P1; for(int i = 0; i < points.size(); i++) { i0 = i; i1 = (i == (points.size() - 1)) ? 0 : i + 1; P0 = points[i0]; P1 = points[i1]; A = P0._y - P1._y; B = P1._x - P0._x; C = (P0._x * P1._y) - (P1._x * P0._y); D = (A * position._x) + (B * position._y) + C; if(D > 0) { return false; } } return true; }
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; }