public void FindMaxSeparation(EdgeResults results, PolygonShape poly1, Transform xf1, PolygonShape poly2, Transform xf2)
{
int count1 = poly1.VertexCount;
Vec2[] normals1 = poly1.Normals;
//Vec2 v = poly2.m_centroid;
// Vector pointing from the centroid of poly1 to the centroid of poly2.
// before inline:
Transform.MulToOutUnsafe(xf2, poly2.Centroid, D);
Transform.MulToOutUnsafe(xf1, poly1.Centroid, temp);
D.SubLocal(temp);
Rot.MulTransUnsafe(xf1.Q, D, dLocal1);
float dLocal1X = dLocal1.X;
float dLocal1Y = dLocal1.Y;
// after inline:
// final float predy = xf2.p.y + xf2.q.ex.y * v.x + xf2.q.ey.y * v.y;
// final float predx = xf2.p.x + xf2.q.ex.x * v.x + xf2.q.ey.x * v.y;
// final Vec2 v1 = poly1.m_centroid;
// final float tempy = xf1.p.y + xf1.q.ex.y * v1.x + xf1.q.ey.y * v1.y;
// final float tempx = xf1.p.x + xf1.q.ex.x * v1.x + xf1.q.ey.x * v1.y;
// final float dx = predx - tempx;
// final float dy = predy - tempy;
//
// final Mat22 R = xf1.q;
// final float dLocal1x = dx * R.ex.x + dy * R.ex.y;
// final float dLocal1y = dx * R.ey.x + dy * R.ey.y;
// end inline
// Find edge normal on poly1 that has the largest projection onto d.
int edge = 0;
//UPGRADE_TODO: The equivalent in .NET for field 'java.lang.Float.MIN_VALUE' may return a different value. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1043'"
float maxDot = Single.Epsilon;
for (int i = 0; i < count1; i++)
{
Vec2 normal = normals1[i];
float dot = normal.X * dLocal1X + normal.Y * dLocal1Y;
if (dot > maxDot)
{
maxDot = dot;
edge = i;
}
}
// Get the separation for the edge normal.
float s = EdgeSeparation(poly1, xf1, edge, poly2, xf2);
// Check the separation for the previous edge normal.
int prevEdge = edge - 1 >= 0 ? edge - 1 : count1 - 1;
float sPrev = EdgeSeparation(poly1, xf1, prevEdge, poly2, xf2);
// Check the separation for the next edge normal.
int nextEdge = edge + 1 < count1 ? edge + 1 : 0;
float sNext = EdgeSeparation(poly1, xf1, nextEdge, poly2, xf2);
// Find the best edge and the search direction.
int bestEdge;
float bestSeparation;
int increment;
if (sPrev > s && sPrev > sNext)
{
increment = -1;
bestEdge = prevEdge;
bestSeparation = sPrev;
}
else if (sNext > s)
{
increment = 1;
bestEdge = nextEdge;
bestSeparation = sNext;
}
else
{
results.EdgeIndex = edge;
results.Separation = s;
return;
}
// Perform a local search for the best edge normal.
for (; ; )
{
if (increment == -1)
{
edge = bestEdge - 1 >= 0 ? bestEdge - 1 : count1 - 1;
}
else
{
edge = bestEdge + 1 < count1 ? bestEdge + 1 : 0;
}
s = EdgeSeparation(poly1, xf1, edge, poly2, xf2);
if (s > bestSeparation)
{
bestEdge = edge;
bestSeparation = s;
}
else
{
break;
}
}
results.EdgeIndex = bestEdge;
results.Separation = bestSeparation;
}