@@ -109,11 +109,119 @@ public void EqualsWithTolerance()
109109 Assert . AreEqual ( false , one . Equals ( two , Angle . FromRadians ( 0.1 ) ) ) ;
110110 }
111111
112+ [ TestCase ( 0 , 1 ) ]
113+ [ TestCase ( 30 , 0.86602540378443871 ) ]
114+ [ TestCase ( - 30 , 0.86602540378443871 ) ]
115+ [ TestCase ( 45 , 0.70710678118654757 ) ]
116+ [ TestCase ( - 45 , 0.70710678118654757 ) ]
117+ [ TestCase ( 60 , 0.5 ) ]
118+ [ TestCase ( - 60 , 0.5 ) ]
119+ [ TestCase ( 90 , 0 ) ]
120+ [ TestCase ( - 90 , 0 ) ]
121+ [ TestCase ( 120 , - 0.5 ) ]
122+ [ TestCase ( - 120 , - 0.5 ) ]
123+ [ TestCase ( 180 , - 1 ) ]
124+ [ TestCase ( - 180 , - 1 ) ]
125+ [ TestCase ( 270 , 0 ) ]
126+ public void CosineRoundTrip ( double degrees , double cosine )
127+ {
128+ var angle = Angle . FromDegrees ( degrees ) ;
129+ Assert . AreEqual ( cosine , angle . Cos , 1e-15 ) ;
130+
131+ if ( degrees >= 0 && degrees <= 180 )
132+ {
133+ var recovered = Angle . Acos ( cosine ) ;
134+ Assert . AreEqual ( angle . Degrees , recovered . Degrees , 1e-6 ) ;
135+ }
136+ }
137+
138+ [ Test ]
139+ public void AcosException ( )
140+ {
141+ Assert . Throws < ArgumentOutOfRangeException > ( ( ) => Angle . Acos ( 5 ) ) ;
142+ }
143+
144+ [ TestCase ( 0 , 0 ) ]
145+ [ TestCase ( 30 , 0.5 ) ]
146+ [ TestCase ( - 30 , - 0.5 ) ]
147+ [ TestCase ( 45 , 0.70710678118654757 ) ]
148+ [ TestCase ( - 45 , - 0.70710678118654757 ) ]
149+ [ TestCase ( 60 , 0.86602540378443871 ) ]
150+ [ TestCase ( - 60 , - 0.86602540378443871 ) ]
151+ [ TestCase ( 90 , 1 ) ]
152+ [ TestCase ( - 90 , - 1 ) ]
153+ [ TestCase ( 120 , 0.86602540378443871 ) ]
154+ [ TestCase ( - 120 , - 0.86602540378443871 ) ]
155+ [ TestCase ( 180 , 0 ) ]
156+ [ TestCase ( - 180 , 0 ) ]
157+ [ TestCase ( 270 , - 1 ) ]
158+ public void SineWithRoundTrip ( double degrees , double sine )
159+ {
160+ var angle = Angle . FromDegrees ( degrees ) ;
161+ Assert . AreEqual ( sine , angle . Sin , 1e-15 ) ;
162+
163+ if ( degrees >= - 90 && degrees <= 90 )
164+ {
165+ var recovered = Angle . Asin ( sine ) ;
166+ Assert . AreEqual ( angle . Degrees , recovered . Degrees , 1e-6 ) ;
167+ }
168+ }
169+
170+ [ Test ]
171+ public void AsinException ( )
172+ {
173+ Assert . Throws < ArgumentOutOfRangeException > ( ( ) => Angle . Asin ( 5 ) ) ;
174+ }
175+
176+ [ TestCase ( 0 , 0 ) ]
177+ [ TestCase ( 30 , 0.57735026918962573 ) ]
178+ [ TestCase ( - 30 , - 0.57735026918962573 ) ]
179+ [ TestCase ( 45 , 1 ) ]
180+ [ TestCase ( - 45 , - 1 ) ]
181+ [ TestCase ( 60 , 1.7320508075688767 ) ]
182+ [ TestCase ( - 60 , - 1.7320508075688767 ) ]
183+ [ TestCase ( 120 , - 1.7320508075688783 ) ]
184+ [ TestCase ( - 120 , 1.7320508075688783 ) ]
185+ [ TestCase ( 180 , 0 ) ]
186+ [ TestCase ( - 180 , 0 ) ]
187+ public void TangentWithRoundTrip ( double degrees , double tangent )
188+ {
189+ var angle = Angle . FromDegrees ( degrees ) ;
190+ Assert . AreEqual ( tangent , angle . Tan , 1e-15 ) ;
191+
192+ if ( degrees >= - 90 && degrees <= 90 )
193+ {
194+ var recovered = Angle . Atan ( tangent ) ;
195+ Assert . AreEqual ( angle . Degrees , recovered . Degrees , 1e-6 ) ;
196+ }
197+ }
198+
199+ [ TestCase ( 0 , 1 , 0 ) ]
200+ [ TestCase ( 30 , 1.7320508075688772935274463415059 , 1 ) ]
201+ [ TestCase ( - 30 , 1.7320508075688772935274463415059 , - 1 ) ]
202+ [ TestCase ( 45 , 1 , 1 ) ]
203+ [ TestCase ( - 45 , 1 , - 1 ) ]
204+ [ TestCase ( 60 , 1 , 1.7320508075688772935274463415059 ) ]
205+ [ TestCase ( - 60 , 1 , - 1.7320508075688772935274463415059 ) ]
206+ [ TestCase ( 90 , 0 , 1 ) ]
207+ [ TestCase ( - 90 , 0 , - 1 ) ]
208+ [ TestCase ( 120 , - 1 , 1.7320508075688772935274463415059 ) ]
209+ [ TestCase ( - 120 , - 1 , - 1.7320508075688772935274463415059 ) ]
210+ [ TestCase ( 150 , - 1.7320508075688772935274463415059 , 1 ) ]
211+ [ TestCase ( - 150 , - 1.7320508075688772935274463415059 , - 1 ) ]
212+ [ TestCase ( 180 , - 1 , 0 ) ]
213+ public void Atan2 ( double degrees , double x , double y )
214+ {
215+ var expected = Angle . FromDegrees ( degrees ) ;
216+ var actual = Angle . Atan2 ( y , x ) ;
217+ Assert . AreEqual ( expected . Degrees , actual . Degrees , 1e-10 ) ;
218+ }
219+
112220 [ TestCase ( 90 , 1.5707963267948966 ) ]
113221 public void FromDegrees ( double degrees , double expected )
114222 {
115223 Assert . AreEqual ( expected , Angle . FromDegrees ( degrees ) . Radians ) ;
116- Assert . AreEqual ( degrees , Angle . FromDegrees ( degrees ) . Degrees , 1E-6 ) ;
224+ Assert . AreEqual ( degrees , Angle . FromDegrees ( degrees ) . Degrees ) ;
117225 }
118226
119227 [ TestCase ( 1 , 1 ) ]
@@ -122,10 +230,10 @@ public void FromRadians(double radians, double expected)
122230 Assert . AreEqual ( expected , Angle . FromRadians ( radians ) . Radians ) ;
123231 }
124232
125- [ TestCase ( 20 , 33 , 49 , 0.35890271998857842 ) ]
233+ [ TestCase ( 20 , 33 , 49 , 0.35890270667277291 ) ]
126234 public void FromSexagesimal ( int degrees , int minutes , double seconds , double expected )
127235 {
128- Assert . AreEqual ( expected , Angle . FromSexagesimal ( degrees , minutes , seconds ) . Radians , 1E-6 ) ;
236+ Assert . AreEqual ( expected , Angle . FromSexagesimal ( degrees , minutes , seconds ) . Radians ) ;
129237 }
130238
131239 [ TestCase ( "5 °" , 5 * DegToRad ) ]
0 commit comments