bool Intersect(Polygon A, Polygon B, Vector& MTD) { // potential separation axes. they get converted into push vectors Vector Axis[32]; // max of 16 vertices per polygon int iNumAxis = 0; for(J = A.num_vertices–1, I = 0; I < A. num_vertices; J = I, I ++) { Vector E = A.vertex[I] – A.vertex[J]; Axis[iNumAxis++] = Vector(-E.y, E.x);
if (AxisSeparatePolygons(N, A, B)) return false; } for(J = B. num_vertices–1, I = 0; I < B.num_vertices; J = I, I ++) { Vector E = B.vertex[I] – B.vertex[J]; Axis[iNumAxis++] = Vector(-E.y, E.x);
if (AxisSeparatePolygons (N, A, B)) return false; }
// find the MTD among all the separation vectors MTD = FindMTD(Axis, iNumAxis);
// makes sure the push vector is pushing A away from B Vector D = A.Position – B.Position; if (D dot MTD < 0.0f) MTD = -MTD;
return true; }
bool AxisSeparatePolygons(Vector& Axis, Polygon A, Polygon B) { float mina, maxa; float minb, maxb;
CalculateInterval(Axis, A, mina, maxa); CalculateInterval(Axis, B, minb, maxb);
// convert the separation axis into a push vector (re-normalise // the axis and multiply by interval overlap) float axis_length_squared = Axis dot Axis;