private Vector2 Project(Vector2 axis)
{
if (Vertices.Count == 0)
return Vector2.Zero;
float min = Vector2.Dot(new Vector2(GetWorldPosition(Vertices[0]).X, GetWorldPosition(Vertices[0]).Y), axis);
float max = min;
for (int i = 1; i < Vertices.Count; i++)
{
// NOTE: the axis must be normalized to get accurate projections
float p = Vector2.Dot(new Vector2(GetWorldPosition(Vertices[i]).X, GetWorldPosition(Vertices[i]).Y), axis);
if (p < min)
{
min = p;
}
else if (p > max)
{
max = p;
}
}
return new Vector2(min, max);
}
private bool Intersects(CollisionConvexPolygon element) { // Loop over the axes of this polygon for (var i = 0; i < _axes.Count; i++) { var axis = _axes[i]; // Project both shapes onto the axis var p1 = Project(axis); var p2 = element.Project(axis); // Do the projections overlap? if (!Overlap(p1, p2)) { // Then we can guarantee that the shapes do not overlap return(false); } } // Loop over element polygon's axes List <Vector2> axes = element.GetAxes(); for (int i = 0; i < axes.Count; i++) { Vector2 axis = axes[i]; // Project both shapes onto the axis Vector2 p1 = Project(axis); Vector2 p2 = element.Project(axis); // Do the projections overlap? if (!Overlap(p1, p2)) { // Then we can guarantee that the shapes do not overlap return(false); } } // If we get here then we know that every axis had overlap on it // so we can guarantee an intersection return(true); }