It looks like your shapes are all four sided polygons, so there's another technique you can use... Convert each 4 sided polygon into 2 triangles. You can then treat your bullets as points and look to see if any triangle has a point within it.

Here is my code to test for a point within a triangle:

/// <summary> /// Determine whether a point P is inside the triangle ABC. Note, this function /// assumes that P is coplanar with the triangle. /// </summary> /// <returns>True if the point is inside, false if it is not.</returns> public static bool PointInTriangle(ref Vector3 A, ref Vector3 B, ref Vector3 C, ref Vector3 P) { //http://blogs.msdn.com/b/rezanour/archive/2011/08/07/barycentric-coordinates-and-point-in-triangle-tests.aspx // Prepare our barycentric variables Vector3 u = B - A; Vector3 v = C - A; Vector3 w = P - A; Vector3 vCrossW = Vector3.Cross(v, w); Vector3 vCrossU = Vector3.Cross(v, u); // Test sign of r if (Vector3.Dot(vCrossW, vCrossU) < 0) return false; Vector3 uCrossW = Vector3.Cross(u, w); Vector3 uCrossV = Vector3.Cross(u, v); // Test sign of t if (Vector3.Dot(uCrossW, uCrossV) < 0) return false; // At this piont, we know that r and t and both > 0 float denom = uCrossV.Length(); float r = vCrossW.Length() / denom; float t = uCrossW.Length() / denom; return (r <= 1 && t <= 1 && r + t <= 1); }

You'll have to look at your maximum worst case scenario as well: How many bullets can be on the screen at the same time? How many triangles will you have to test for intersections? If you're going for a O(N*N) solution, you'll start noticing some performance issues with lots of bullets. Measure the total collision routine run time (in microseconds) and see how much of a performance impact you get as you increase bullet counts. If you don't notice any issues, don't optimize

If you do notice issues, you can either reduce the number of intersection triangles, reduce the number of bullets, or choose an algorithm which runs better than O(N*N) [Quad Trees, BSP, etc].