Point Entity::MTV(Entity other)
{
// GETTING ORIENTED BOUNDING SHAPE:
vector<Point> shape1 = this->getOrientedShape();
vector<Point> shape2 = other.getOrientedShape();
// GETTING NUMBER OF FACES FOR EACH ENTITY:
int total1 = shape1.size();
int total2 = shape2.size();
// INITIALIZING OVERLAP VARIABLE:
float overlap = FLT_MAX;
Point smallest = Point(0, 0);
// FOR EACH FACE RELATIVE TO THIS ENTITY:
for(int i = 0; i < total1; i++)
{
// GET CURRENT FACE:
Point face(shape1[i].x - shape1[(i + 1) % total1].x, shape1[i].y - shape1[(i + 1) % total1].y);
// GET CURRENT AXIS PERPENDICULAR TO THE CURRENT FACE:
Point axis(-face.y, face.x);
// NORMALIZE THE AXIS:
axis /= sqrt(axis.x * axis.x + axis.y * axis.y);
// GET MAXIMUM AND MINIMUM POSSIBLE VALUES OF A FLOAT:
Point overlap1(FLT_MAX, -FLT_MAX);
Point overlap2(FLT_MAX, -FLT_MAX);
// GET THE MAXIMUM AND MINIMUM VALUES OF THIS ENTITY RELATIVE TO THE AXIS:
for(int j = 0; j < total1; j++)
{
float proj1 = ((axis.x * shape1[j].x) + (axis.y * shape1[j].y)) / ((axis.x * axis.x) + (axis.y * axis.y));
overlap1.x = min(proj1, overlap1.x);
overlap1.y = max(proj1, overlap1.y);
}
// GET THE MAXIMUM AND MINIMUM VALUES OF THE OTHER ENTITY RELATIVE TO THE AXIS:
for(int j = 0; j < total2; j++)
{
float proj2 = ((axis.x * shape2[j].x) + (axis.y * shape2[j].y)) / ((axis.x * axis.x) + (axis.y * axis.y));
overlap2.x = min(proj2, overlap2.x);
overlap2.y = max(proj2, overlap2.y);
}
// EXIT IF THE PROJECTIONS DO NOT OVERLAP:
if(overlap1.x > overlap2.y || overlap1.y < overlap2.x)
{
overlap = 0;
return smallest * overlap;
}
// FIND THE SMALLEST OVERLAP:
smallest = axis;
if(overlap1.y > overlap2.x)
{
overlap = min(overlap, overlap1.y - overlap2.x);
} else if(overlap1.x > overlap2.y) {
overlap = min(overlap, overlap1.x - overlap2.y);
}
}
// IF ON ALL AXIS AN OVERLAP OCCURS THEN THE ENTITIES ARE INTERSECTING:
return smallest * overlap;
}