public void Test_LoopTestBase_GetAreaConsistentWithOrientation() { // Test that GetArea() returns an area near 0 for degenerate loops that // contain almost no points, and an area near 4*Pi for degenerate loops that // contain almost all points. const int kMaxVertices = 6; for (int i = 0; i < 50; ++i) { int num_vertices = 3 + S2Testing.Random.Uniform(kMaxVertices - 3 + 1); // Repeatedly choose N vertices that are exactly on the equator until we // find some that form a valid loop. S2PointLoopSpan loop = new(); do { for (int i2 = 0; i2 < num_vertices; ++i2) { // We limit longitude to the range [0, 90] to ensure that the loop is // degenerate (as opposed to following the entire equator). loop.Add( S2LatLng.FromRadians(0, S2Testing.Random.RandDouble() * S2.M_PI_2).ToPoint()); } } while (!new S2Loop(loop, S2Debug.DISABLE).IsValid()); bool ccw = S2.IsNormalized(loop); // The error bound is sufficient for current tests but not guaranteed. _ = i + ": " + loop.ToDebugString(); Assert2.Near(ccw ? 0 : S2.M_4_PI, S2.GetArea(loop), 1e-14); Assert.Equal(!ccw, new S2Loop(loop).Contains(new S2Point(0, 0, 1))); } }