// Given two edges a0a1 and b0b1, check that the minimum distance between them // is "distance_radians", and that GetEdgePairClosestPoints() returns // "expected_a" and "expected_b" as the points that achieve this distance. // S2Point.Empty may be passed for "expected_a" or "expected_b" to indicate // that both endpoints of the corresponding edge are equally distant, and // therefore either one might be returned. // // Parameters are passed by value so that this function can normalize them. private static void CheckEdgePairMinDistance(S2Point a0, S2Point a1, S2Point b0, S2Point b1, double distance_radians, S2Point expected_a, S2Point expected_b) { a0 = a0.Normalize(); a1 = a1.Normalize(); b0 = b0.Normalize(); b1 = b1.Normalize(); expected_a = expected_a.Normalize(); expected_b = expected_b.Normalize(); var closest = S2.GetEdgePairClosestPoints(a0, a1, b0, b1); S2Point actual_a = closest.Item1; S2Point actual_b = closest.Item2; if (expected_a == S2Point.Empty) { // This special value says that the result should be a0 or a1. Assert.True(actual_a == a0 || actual_a == a1); } else { Assert.True(S2.ApproxEquals(expected_a, actual_a)); } if (expected_b == S2Point.Empty) { // This special value says that the result should be b0 or b1. Assert.True(actual_b == b0 || actual_b == b1); } else { Assert.True(S2.ApproxEquals(expected_b, actual_b)); } S1ChordAngle min_distance = S1ChordAngle.Zero; Assert.False(S2.UpdateEdgePairMinDistance(a0, a1, b0, b1, ref min_distance)); min_distance = S1ChordAngle.Infinity; Assert.True(S2.UpdateEdgePairMinDistance(a0, a1, b0, b1, ref min_distance)); Assert2.Near(distance_radians, min_distance.Radians(), S2.DoubleError); }