public Vector2? Intersects(CollisionPolygon other) { return TestForIntersection(this, other); }
public static Projection ProjectPolygonOntoAxis(CollisionPolygon polygon, Vector2 axis) { float min = float.PositiveInfinity; float max = float.NegativeInfinity; foreach (Vector2 vertex in polygon.VertexList) { float value = Vector2.Dot(vertex, axis); min = Math.Min(min, value); max = Math.Max(max, value); } return new Projection(min, max); }
// uses the separating axis theorem to look for a collision between these two polygons // this will only work if the polygons are convex. Do not use concave polygons. // Instead, decompose concave polygons into a composition of convex polygons. // // if there is no collision, null is returned // otherwise, the minimum transport vector to get out of the collision is returned // the minimum transport vector is intended to move polygon1 away from polygon2 public static Vector2? TestForIntersection(CollisionPolygon polygon1, CollisionPolygon polygon2) { float transportMagnitude = float.PositiveInfinity; Vector2? transportAxis = null; foreach (Vector2 axis in polygon1.AxesList) { Projection projection1 = ProjectPolygonOntoAxis(polygon1, axis); Projection projection2 = ProjectPolygonOntoAxis(polygon2, axis); //If there is no overlap, we can conclude the polygons do not intersect if (!projection1.OverlapsWith(projection2)) return null; float o = projection1.CalculateOverlap(projection2); if (o < transportMagnitude) { transportMagnitude = o; transportAxis = axis; } } foreach (Vector2 axis in polygon2.AxesList) { Projection projection1 = ProjectPolygonOntoAxis(polygon1, axis); Projection projection2 = ProjectPolygonOntoAxis(polygon2, axis); //If there is no overlap, we can conclude the polygons do not intersect if (!projection1.OverlapsWith(projection2)) return null; float o = projection1.CalculateOverlap(projection2); if (o < transportMagnitude) { transportMagnitude = o; transportAxis = axis; } } return transportMagnitude * transportAxis; }