Vector2 getProjection(Vector2* vertices, int numVertices, Vector2 axis) { // Find the min and max vertex projections float32 min = axis.dot(vertices[0]); float32 max = min; for (int v = 1; v < numVertices; v++) { float32 d = axis.dot(vertices[v]); if (d < min) { min = d; } else if (d > max) { max = d; } } return Vector2 { min, max }; } bool projectionsOverlap(Vector2 first, Vector2 second) { return first.x <= second.y && second.x <= first.y; } bool doIntersect(ConvexPolygon* first, ConvexPolygon* second) { IntersectionResult ir; // Check agaisnt the edges of the first polygon for (int i = 0; i < first->numVertices; i++) { Vector2 normal = first->edges[i].normal; Vector2 firstProj = getProjection(first->transformedVertices, first->numVertices, normal); Vector2 secondProj = getProjection(second->transformedVertices, second->numVertices, normal); if (!projectionsOverlap(firstProj, secondProj)) { return false; } } // Check against the edges of the second polygon for (int i = 0; i < second->numVertices; i++) { Vector2 normal = second->edges[i].normal; Vector2 firstProj = getProjection(first->transformedVertices, first->numVertices, normal); Vector2 secondProj = getProjection(second->transformedVertices, second->numVertices, normal); if (!projectionsOverlap(firstProj, secondProj)) { return false; } } return true; }