public void Test_S1ChordAngle_Trigonometry() { const int kIters = 20; for (int iter = 0; iter <= kIters; ++iter) { double radians = Math.PI * iter / kIters; S1ChordAngle angle = new(S1Angle.FromRadians(radians)); Assert2.Near(Math.Sin(radians), angle.Sin(), S2.DoubleError); Assert2.Near(Math.Cos(radians), angle.Cos(), S2.DoubleError); // Since the tan(x) is unbounded near Pi/4, we map the result back to an // angle before comparing. (The assertion is that the result is equal to // the tangent of a nearby angle.) Assert2.Near(Math.Atan(Math.Tan(radians)), Math.Atan(angle.Tan()), S2.DoubleError); } // Unlike S1Angle, S1ChordAngle can represent 90 and 180 degrees exactly. S1ChordAngle angle90 = S1ChordAngle.FromLength2(2); S1ChordAngle angle180 = S1ChordAngle.FromLength2(4); Assert.Equal(1, angle90.Sin()); Assert.Equal(0, angle90.Cos()); Assert.Equal(double.PositiveInfinity, angle90.Tan()); Assert.Equal(0, angle180.Sin()); Assert.Equal(-1, angle180.Cos()); Assert.Equal(0, angle180.Tan()); }
public void Test_S2_UpdateMinInteriorDistanceRejectionTestIsConservative() { // This test checks several representative cases where previously // UpdateMinInteriorDistance was failing to update the distance because a // rejection test was not being done conservatively. // // Note that all of the edges AB in this test are nearly antipodal. { S2Point x = new(1, -4.6547732744037044e-11, -5.6374428459823598e-89); S2Point a = new(1, -8.9031850507928352e-11, 0); S2Point b = new(-0.99999999999996347, 2.7030110029169596e-07, 1.555092348806121e-99); var min_dist = S1ChordAngle.FromLength2(6.3897233584120815e-26); Assert.True(S2.UpdateMinInteriorDistance(x, a, b, ref min_dist)); } { S2Point x = new(1, -4.7617930898495072e-13, 0); S2Point a = new(-1, -1.6065916409055676e-10, 0); S2Point b = new(1, 0, 9.9964883247706732e-35); var min_dist = S1ChordAngle.FromLength2(6.3897233584120815e-26); Assert.True(S2.UpdateMinInteriorDistance(x, a, b, ref min_dist)); } { S2Point x = new(1, 0, 0); S2Point a = new(1, -8.4965026896454536e-11, 0); S2Point b = new(-0.99999999999966138, 8.2297529603339328e-07, 9.6070344113320997e-21); var min_dist = S1ChordAngle.FromLength2(6.3897233584120815e-26); Assert.True(S2.UpdateMinInteriorDistance(x, a, b, ref min_dist)); } }
public void Test_S1ChordAngle_FromLength2() { Assert.Equal(0, S1ChordAngle.FromLength2(0).Degrees()); Assert2.DoubleEqual(60, S1ChordAngle.FromLength2(1).Degrees()); Assert2.DoubleEqual(90, S1ChordAngle.FromLength2(2).Degrees()); Assert.Equal(180, S1ChordAngle.FromLength2(4).Degrees()); Assert.Equal(180, S1ChordAngle.FromLength2(5).Degrees()); }
public void Test_S1ChordAngle_PlusError() { Assert.Equal(S1ChordAngle.Negative, S1ChordAngle.Negative.PlusError(5)); Assert.Equal(S1ChordAngle.Infinity, S1ChordAngle.Infinity.PlusError(-5)); Assert.Equal(S1ChordAngle.Straight, S1ChordAngle.Straight.PlusError(5)); Assert.Equal(S1ChordAngle.Zero, S1ChordAngle.Zero.PlusError(-5)); Assert.Equal(S1ChordAngle.FromLength2(1.25), S1ChordAngle.FromLength2(1).PlusError(0.25)); Assert.Equal(S1ChordAngle.FromLength2(0.75), S1ChordAngle.FromLength2(1).PlusError(-0.25)); }
public void Test_S1ChordAngle_Negative() { Assert.True(S1ChordAngle.Negative < S1ChordAngle.Zero); Assert.True(S1ChordAngle.Negative == S1ChordAngle.FromLength2(-1)); Assert.True(S1ChordAngle.Negative.ToAngle() < S1Angle.Zero); }