Jypeli  5
The simple game programming library
Angle.cs
Siirry tämän tiedoston dokumentaatioon.
1 #region MIT License
2 /*
3  * Copyright (c) 2009 University of Jyväskylä, Department of Mathematical
4  * Information Technology.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 #endregion
25 
26 /*
27  * Authors: Tero Jäntti, Tomi Karppinen, Janne Nikkanen.
28  */
29 
30 using System;
31 using AdvanceMath;
32 using System.Globalization;
33 
34 namespace Jypeli
35 {
40  public struct Angle
41  {
45  public static readonly Angle Zero = new Angle( 0 );
46 
50  public static readonly Angle RightAngle = new Angle( 0.5 * Math.PI );
51 
55  public static readonly Angle StraightAngle = new Angle( Math.PI );
56 
60  public static readonly Angle FullAngle = new Angle( 2 * Math.PI );
61 
62 
63  private double radian;
64 
69  public double Degrees
70  {
71  get
72  {
73  return RadianToDegree( radian );
74  }
75  set
76  {
77  radian = DegreeToRadian( value );
78  }
79  }
80 
85  public double Radians
86  {
87  get { return radian; }
88  set
89  {
90  radian = AdvanceMath.MathHelper.ClampAngle( (float)value );
91  }
92  }
93 
98  {
99  get
100  {
101  if ( radian >= -Math.PI / 4 && radian <= Math.PI / 4 ) return Direction.Right;
102  if ( radian > Math.PI / 4 && radian < 3 * Math.PI / 4 ) return Direction.Up;
103  if ( radian < -Math.PI / 4 && radian > -3 * Math.PI / 4 ) return Direction.Down;
104  return Direction.Left;
105  }
106  }
107 
111  public double Sin
112  {
113  get { return Math.Sin( this.Radians ); }
114  }
115 
119  public double Cos
120  {
121  get { return Math.Cos( this.Radians ); }
122  }
123 
127  public double Tan
128  {
129  get { return Math.Tan( this.Radians ); }
130  }
131 
132 
133  private Angle( double radians )
134  {
135  this.radian = AdvanceMath.MathHelper.ClampAngle( (float)radians );
136  }
137 
138  #region Operators
139 
146  public static Angle operator +( Angle a, Angle b )
147  {
148  return FromRadians( a.Radians + b.Radians );
149  }
150 
157  public static Angle operator -( Angle a, Angle b )
158  {
159  return FromRadians( a.Radians - b.Radians );
160  }
161 
166  public static Angle operator -( Angle a )
167  {
168  return FromRadians( -a.Radians );
169  }
170 
177  public static Angle operator *( double a, Angle b )
178  {
179  return FromRadians( a * b.Radians );
180  }
181 
188  public static Angle operator *( Angle a, double b )
189  {
190  return FromRadians( a.Radians * b );
191  }
192 
199  public static Angle operator /( Angle a, double b )
200  {
201  return FromRadians( a.Radians / b );
202  }
203 
210  public static bool operator ==( Angle a, Angle b )
211  {
212  return a.Radians == b.Radians;
213  }
214 
221  public static bool operator !=( Angle a, Angle b )
222  {
223  return a.Radians != b.Radians;
224  }
225 
232  public static bool operator <( Angle a, Angle b )
233  {
234  return a.Radians < b.Radians;
235  }
236 
243  public static bool operator <=( Angle a, Angle b )
244  {
245  return a.Radians <= b.Radians;
246  }
247 
254  public static bool operator >( Angle a, Angle b )
255  {
256  return a.Radians > b.Radians;
257  }
258 
265  public static bool operator >=( Angle a, Angle b )
266  {
267  return a.Radians >= b.Radians;
268  }
269 
275  public static explicit operator UnlimitedAngle( Angle angle )
276  {
277  return angle.Unlimit();
278  }
279 
286  public static Angle Sum(UnlimitedAngle a, Angle b)
287  {
288  return Angle.FromRadians( a.Radians + b.Radians );
289  }
290 
297  public static Angle Sum( Angle a, UnlimitedAngle b )
298  {
299  return Angle.FromRadians( a.Radians + b.Radians );
300  }
301 
302  #endregion
303 
308  {
309  return UnlimitedAngle.FromRadians( this.radian );
310  }
311 
316  public static Angle FromRadians( double radian )
317  {
318  return new Angle( radian );
319  }
320 
325  public static Angle FromDegrees( double degree )
326  {
327  return new Angle( DegreeToRadian( degree ) );
328  }
329 
335  public static double DegreeToRadian( double degree )
336  {
337  return AdvanceMath.MathHelper.ClampAngle( (float)(degree * ( System.Math.PI / 180 )) );
338  }
339 
345  public static double RadianToDegree( double radian )
346  {
347  double a = AdvanceMath.MathHelper.ClampAngle( (float)radian );
348  return a * ( 180 / System.Math.PI );
349  }
350 
356  public static Angle Complement( Angle a )
357  {
358  return FromRadians( 0.5 * Math.PI - a.Radians );
359  }
360 
366  public static Angle Supplement( Angle a )
367  {
368  return FromRadians( Math.PI - a.Radians );
369  }
370 
376  public static Angle Explement( Angle a )
377  {
378  return FromRadians( 2 * Math.PI - a.Radians );
379  }
380 
387  public override int GetHashCode()
388  {
389  return Convert.ToInt32( Degrees );
390  }
391 
397  public override bool Equals( object obj )
398  {
399  if ( obj is Angle )
400  {
401  return Double.Equals( this.Radians, ( (Angle)obj ).Radians );
402  }
403 
404  return false;
405  }
406 
407  public override string ToString()
408  {
409  return radian.ToString( System.Globalization.NumberFormatInfo.InvariantInfo );
410  }
411 
412  public string ToString( IFormatProvider formatProvider )
413  {
414  return radian.ToString( formatProvider );
415  }
416 
417  public static Angle Parse( string angleStr, IFormatProvider formatProvider )
418  {
419  return new Angle( double.Parse( angleStr, formatProvider ) );
420  }
421 
422  public static Angle Parse( string angleStr )
423  {
424  return new Angle( double.Parse( angleStr, NumberFormatInfo.InvariantInfo ) );
425  }
426 
432  public double GetPositiveRadians()
433  {
434  return Radians >= 0 ? Radians : Math.PI * 2 + Radians;
435  }
436 
442  public double GetPositiveDegrees()
443  {
444  return Degrees >= 0 ? Degrees : 360 + Degrees;
445  }
446 
447  public Vector GetVector()
448  {
449  return Vector.FromAngle( this );
450  }
451 
452  #region Arcusfunktiot
453 
459  public static Angle ArcSin( double d )
460  {
461  return new Angle( Math.Asin( d ) );
462  }
463 
469  public static Angle ArcCos( double d )
470  {
471  return new Angle( Math.Acos( d ) );
472  }
473 
479  public static Angle ArcTan( double d )
480  {
481  return new Angle( Math.Atan( d ) );
482  }
483 
484  #endregion
485  }
486 }
static Angle operator+(Angle a, Angle b)
Laskee kaksi kulmaa yhteen.
Definition: Angle.cs:146
static Direction Down
Suunta alas.
Definition: Direction.cs:65
override int GetHashCode()
Palauttaa kulmaa yksilöivän luvun, tässä tapauksessa kulman asteluvun.
Definition: Angle.cs:387
static Angle operator/(Angle a, double b)
Jakaa kulman reaaliluvulla.
Definition: Angle.cs:199
static Vector FromAngle(Angle angle)
Luo vektorin kulman perusteella yksikköpituudella.
Definition: Vector.cs:118
override string ToString()
Definition: Angle.cs:407
static Angle Sum(UnlimitedAngle a, Angle b)
Laskee yhteen rajoittamattoman ja rajoitetun kulman, palauttaen rajoitetun kulman.
Definition: Angle.cs:286
static bool operator==(Angle a, Angle b)
Vertaa kahden kulman yhtäsuuruutta.
Definition: Angle.cs:210
static double DegreeToRadian(double degree)
Muuttaa asteet radiaaneiksi.
Definition: Angle.cs:335
static Angle ArcCos(double d)
Palauttaa kulman joka vastaa d:n arcuskosini.
Definition: Angle.cs:469
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
double GetPositiveRadians()
Palauttaa kulman radiaaneina siten, että se on aina positiivinen. Hyödyllinen esimerkiksi ympyrän kaa...
Definition: Angle.cs:432
static Direction Left
Suunta vasemmalle.
Definition: Direction.cs:70
static Angle Parse(string angleStr)
Definition: Angle.cs:422
static Angle Sum(Angle a, UnlimitedAngle b)
Laskee yhteen rajoitetun ja rajoittamattoman kulman, palauttaen rajoitetun kulman.
Definition: Angle.cs:297
static Angle operator*(double a, Angle b)
Kertoo kulman reaaliluvulla.
Definition: Angle.cs:177
override bool Equals(object obj)
Tarkistaa kahden kulman yhtäsuuruuden. Jos parametrinä annetaan jotain muuta kuin kulma...
Definition: Angle.cs:397
static bool operator<(Angle a, Angle b)
Vertaa ensimmäisen kulman suuremmuutta toiseen.
Definition: Angle.cs:232
static readonly Angle RightAngle
Suora kulma (90 astetta).
Definition: Angle.cs:50
static bool operator>=(Angle a, Angle b)
Vertaa ensimmäisen kulman pienemmyyttä/yhtäsuuruutta toiseen.
Definition: Angle.cs:265
static readonly Angle StraightAngle
Oikokulma (180 astetta).
Definition: Angle.cs:55
Perussuunta tasossa.
Definition: Direction.cs:50
static Angle Parse(string angleStr, IFormatProvider formatProvider)
Definition: Angle.cs:417
static Angle ArcSin(double d)
Palauttaa kulman joka vastaa d:n arcus-sini.
Definition: Angle.cs:459
static Angle FromRadians(double radian)
Luo kulman annettujen radiaanien mukaan.
Definition: Angle.cs:316
double Degrees
Palauttaa tai asettaa kulman asteina.
Definition: Angle.cs:70
static Angle operator-(Angle a, Angle b)
Vähentää jälkimmäisen kulman ensimmäisestä.
Definition: Angle.cs:157
static readonly Angle Zero
Nollakulma.
Definition: Angle.cs:45
static Angle Explement(Angle a)
Laskee eksplementtikulman (360 asteen kulman toinen puoli)
Definition: Angle.cs:376
static Angle Complement(Angle a)
Laskee komplementtikulman (90 asteen kulman toinen puoli)
Definition: Angle.cs:356
double GetPositiveDegrees()
Palauttaa kulman asteina siten, että se on aina positiivinen. Hyödyllinen esimerkiksi ympyrän kaarien...
Definition: Angle.cs:442
double Radians
Palauttaa tai asettaa kulman radiaaneina.
Definition: Angle.cs:86
double Sin
Kulman sini.
Definition: Angle.cs:112
Direction MainDirection
Kulmaa vastaava pääilmansuunta.
Definition: Angle.cs:98
static bool operator>(Angle a, Angle b)
Vertaa ensimmäisen kulman pienemmyyttä toiseen.
Definition: Angle.cs:254
static readonly Angle FullAngle
Täysikulma (360 astetta).
Definition: Angle.cs:60
string ToString(IFormatProvider formatProvider)
Definition: Angle.cs:412
static Angle Supplement(Angle a)
Laskee suplementtikulman (180 asteen kulman toinen puoli)
Definition: Angle.cs:366
static Angle ArcTan(double d)
Palauttaa kulman joka vastaa d:n arcus-tangentti.
Definition: Angle.cs:479
static Direction Right
Suunta oikealle.
Definition: Direction.cs:75
static bool operator!=(Angle a, Angle b)
Vertaa kahden kulman erisuuruutta.
Definition: Angle.cs:221
double Cos
Kulman kosini.
Definition: Angle.cs:120
static bool operator<=(Angle a, Angle b)
Vertaa ensimmäisen kulman suuremmuutta/yhtäsuuruutta toiseen.
Definition: Angle.cs:243
Vector GetVector()
Definition: Angle.cs:447
static double RadianToDegree(double radian)
Muuttaa radiaanit asteiksi.
Definition: Angle.cs:345
Rajoittamaton kulma (asteina ja radiaaneina). Tietoja kulmasta: http://en.wikipedia.org/wiki/File:Degree-Radian_Conversion.svg
static Direction Up
Suunta ylös.
Definition: Direction.cs:60
double Tan
Kulman tangentti.
Definition: Angle.cs:128
2D-vektori.
Definition: Vector.cs:56
static UnlimitedAngle FromRadians(double radian)
Luo kulman annettujen radiaanien mukaan.
UnlimitedAngle Unlimit()
Palauttaa vastaavan rajoittamattoman kulman.
Definition: Angle.cs:307
double Radians
Palauttaa tai asettaa kulman radiaaneina.
static Angle FromDegrees(double degree)
Luo kulman annettujen asteiden mukaan.
Definition: Angle.cs:325