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()); }