Beispiel #1
0
    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());
    }
Beispiel #2
0
 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));
     }
 }
Beispiel #3
0
 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());
 }
Beispiel #4
0
 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));
 }
Beispiel #5
0
 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);
 }