/// <summary> /// Check if the polys are similar to within a tolerance (Doesn't include reflections, /// but allows for the points to be numbered differently, but not reversed). /// </summary> /// <param name="poly1"></param> /// <param name="poly2"></param> /// <returns></returns> public static bool PolygonsAreSame2D(IList<Point2D> poly1, IList<Point2D> poly2) { int numVerts1 = poly1.Count; int numVerts2 = poly2.Count; if (numVerts1 != numVerts2) { return false; } const double kEpsilon = 0.01; const double kEpsilonSq = kEpsilon * kEpsilon; // Bounds the same to within tolerance, are there polys the same? Point2D vdelta = new Point2D(0.0, 0.0); for (int k = 0; k < numVerts2; ++k) { // Look for a match in verts2 to the first vertex in verts1 vdelta.Set(poly1[0]); vdelta.Subtract(poly2[k]); if (vdelta.MagnitudeSquared() < kEpsilonSq) { // Found match to the first point, now check the other points continuing round // if the points don't match in the first direction we check, then it's possible // that the polygons have a different winding order, so we check going round // the opposite way as well int matchedVertIndex = k; bool bReverseSearch = false; while (true) { bool bMatchFound = true; for (int i = 1; i < numVerts1; ++i) { if (!bReverseSearch) { ++k; } else { --k; if (k < 0) { k = numVerts2 - 1; } } vdelta.Set(poly1[i]); vdelta.Subtract(poly2[k % numVerts2]); if (vdelta.MagnitudeSquared() >= kEpsilonSq) { if (bReverseSearch) { // didn't find a match going in either direction, so the polygons are not the same return false; } else { // mismatch in the first direction checked, so check the other direction. k = matchedVertIndex; bReverseSearch = true; bMatchFound = false; break; } } } if (bMatchFound) { return true; } } } } return false; }