Jypeli  5
The simple game programming library
UnlimitedAngle.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 UnlimitedAngle
41  {
45  public static readonly UnlimitedAngle Zero = new UnlimitedAngle( 0 );
46 
50  public static readonly UnlimitedAngle RightAngle = new UnlimitedAngle( 0.5 * Math.PI );
51 
55  public static readonly UnlimitedAngle StraightAngle = new UnlimitedAngle( Math.PI );
56 
60  public static readonly UnlimitedAngle FullAngle = new UnlimitedAngle( 2 * Math.PI );
61 
65  public static readonly UnlimitedAngle Infinity = new UnlimitedAngle( double.PositiveInfinity );
66 
67  private double radian;
68 
73  public double Degrees
74  {
75  get
76  {
77  return RadianToDegree( radian );
78  }
79  set
80  {
81  radian = DegreeToRadian( value );
82  }
83  }
84 
89  public double Radians
90  {
91  get { return radian; }
92  set
93  {
94  radian = (float)value;
95  }
96  }
97 
101  public Direction MainDirection
102  {
103  get
104  {
105  if ( radian >= -Math.PI / 4 && radian <= Math.PI / 4 ) return Direction.Right;
106  if ( radian > Math.PI / 4 && radian < 3 * Math.PI / 4 ) return Direction.Up;
107  if ( radian < -Math.PI / 4 && radian > -3 * Math.PI / 4 ) return Direction.Down;
108  return Direction.Left;
109  }
110  }
111 
115  public double Sin
116  {
117  get { return Math.Sin( this.Radians ); }
118  }
119 
123  public double Cos
124  {
125  get { return Math.Cos( this.Radians ); }
126  }
127 
131  public double Tan
132  {
133  get { return Math.Tan( this.Radians ); }
134  }
135 
136 
137  private UnlimitedAngle( double radians )
138  {
139  this.radian = (float)radians;
140  }
141 
142  #region Operators
143 
151  {
152  return FromRadians( a.Radians + b.Radians );
153  }
154 
162  {
163  return FromRadians( a.Radians - b.Radians );
164  }
165 
171  {
172  return FromRadians( -a.Radians );
173  }
174 
181  public static UnlimitedAngle operator *( double a, UnlimitedAngle b )
182  {
183  return FromRadians( a * b.Radians );
184  }
185 
192  public static UnlimitedAngle operator *( UnlimitedAngle a, double b )
193  {
194  return FromRadians( a.Radians * b );
195  }
196 
203  public static UnlimitedAngle operator /( UnlimitedAngle a, double b )
204  {
205  return FromRadians( a.Radians / b );
206  }
207 
214  public static bool operator ==( UnlimitedAngle a, UnlimitedAngle b )
215  {
216  return a.Radians == b.Radians;
217  }
218 
225  public static bool operator !=( UnlimitedAngle a, UnlimitedAngle b )
226  {
227  return a.Radians != b.Radians;
228  }
229 
236  public static bool operator <( UnlimitedAngle a, UnlimitedAngle b )
237  {
238  return a.Radians < b.Radians;
239  }
240 
247  public static bool operator <=( UnlimitedAngle a, UnlimitedAngle b )
248  {
249  return a.Radians <= b.Radians;
250  }
251 
258  public static bool operator >( UnlimitedAngle a, UnlimitedAngle b )
259  {
260  return a.Radians > b.Radians;
261  }
262 
269  public static bool operator >=( UnlimitedAngle a, UnlimitedAngle b )
270  {
271  return a.Radians >= b.Radians;
272  }
273 
279  public static explicit operator Angle( UnlimitedAngle angle )
280  {
281  return angle.Limit();
282  }
283 
290  public static UnlimitedAngle Sum( UnlimitedAngle a, Angle b )
291  {
292  return UnlimitedAngle.FromRadians( a.Radians + b.Radians );
293  }
294 
301  public static UnlimitedAngle Sum( Angle a, UnlimitedAngle b )
302  {
303  return UnlimitedAngle.FromRadians( a.Radians + b.Radians );
304  }
305 
306  #endregion
307 
311  public Angle Limit()
312  {
313  return Angle.FromRadians( this.radian );
314  }
315 
320  public static UnlimitedAngle FromRadians( double radian )
321  {
322  return new UnlimitedAngle( radian );
323  }
324 
329  public static UnlimitedAngle FromDegrees( double degree )
330  {
331  return new UnlimitedAngle( DegreeToRadian( degree ) );
332  }
333 
339  public static double DegreeToRadian( double degree )
340  {
341  return (float)(degree * ( System.Math.PI / 180 ));
342  }
343 
349  public static double RadianToDegree( double radian )
350  {
351  return radian * ( 180 / Math.PI );
352  }
353 
360  public override int GetHashCode()
361  {
362  return Convert.ToInt32( Degrees );
363  }
364 
370  public override bool Equals( object obj )
371  {
372  if ( obj is UnlimitedAngle )
373  {
374  return Double.Equals( this.Radians, ( (UnlimitedAngle)obj ).Radians );
375  }
376 
377  else if ( obj is Angle )
378  {
379  return Double.Equals( this.Radians, ( (Angle)obj ).Radians );
380  }
381 
382  return false;
383  }
384 
385  public override string ToString()
386  {
387  return radian.ToString( System.Globalization.NumberFormatInfo.InvariantInfo );
388  }
389 
390  public string ToString( IFormatProvider formatProvider )
391  {
392  return radian.ToString( formatProvider );
393  }
394 
395  public static UnlimitedAngle Parse( string angleStr, IFormatProvider formatProvider )
396  {
397  return new UnlimitedAngle( double.Parse( angleStr, formatProvider ) );
398  }
399 
400  public static UnlimitedAngle Parse( string angleStr )
401  {
402  return new UnlimitedAngle( double.Parse( angleStr, NumberFormatInfo.InvariantInfo ) );
403  }
404 
410  public double GetPositiveRadians()
411  {
412  return Radians > 0 ? Radians : Math.PI * 2 + Radians;
413  }
414 
420  public double GetPositiveDegrees()
421  {
422  double deg = Degrees;
423  while ( deg < 0 ) deg += 360;
424  return deg;
425  }
426 
427  public Vector GetVector()
428  {
429  return Vector.FromAngle( Limit() );
430  }
431 
432  #region Arcusfunktiot
433 
439  public static UnlimitedAngle ArcSin( double d )
440  {
441  return new UnlimitedAngle( Math.Asin( d ) );
442  }
443 
449  public static UnlimitedAngle ArcCos( double d )
450  {
451  return new UnlimitedAngle( Math.Acos( d ) );
452  }
453 
459  public static UnlimitedAngle ArcTan( double d )
460  {
461  return new UnlimitedAngle( Math.Atan( d ) );
462  }
463 
464  #endregion
465  }
466 }
static bool operator<(UnlimitedAngle a, UnlimitedAngle b)
Vertaa ensimmäisen kulman suuremmuutta toiseen.
static Direction Down
Suunta alas.
Definition: Direction.cs:65
static UnlimitedAngle ArcTan(double d)
Palauttaa kulman joka vastaa d:n arcus-tangentti.
static bool operator>=(UnlimitedAngle a, UnlimitedAngle b)
Vertaa ensimmäisen kulman pienemmyyttä/yhtäsuuruutta toiseen.
static Vector FromAngle(Angle angle)
Luo vektorin kulman perusteella yksikköpituudella.
Definition: Vector.cs:118
static readonly UnlimitedAngle Infinity
Ääretön kulma.
double Tan
Kulman tangentti.
Direction MainDirection
Kulmaa vastaava pääilmansuunta.
string ToString(IFormatProvider formatProvider)
static UnlimitedAngle operator/(UnlimitedAngle a, double b)
Jakaa kulman reaaliluvulla.
static UnlimitedAngle Sum(UnlimitedAngle a, Angle b)
Laskee yhteen rajoittamattoman ja rajoitetun kulman, palauttaen rajoittamattoman kulman.
override bool Equals(object obj)
Tarkistaa kahden kulman yhtäsuuruuden. Jos parametrinä annetaan jotain muuta kuin kulma...
double Cos
Kulman kosini.
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
static bool operator!=(UnlimitedAngle a, UnlimitedAngle b)
Vertaa kahden kulman erisuuruutta.
double GetPositiveDegrees()
Palauttaa kulman asteina siten, että se on aina positiivinen. Hyödyllinen esimerkiksi ympyrän kaarien...
static Direction Left
Suunta vasemmalle.
Definition: Direction.cs:70
double Sin
Kulman sini.
static readonly UnlimitedAngle FullAngle
Täysikulma (360 astetta).
static UnlimitedAngle FromDegrees(double degree)
Luo kulman annettujen asteiden mukaan.
double GetPositiveRadians()
Palauttaa kulman radiaaneina siten, että se on aina positiivinen. Hyödyllinen esimerkiksi ympyrän kaa...
static double DegreeToRadian(double degree)
Muuttaa asteet radiaaneiksi.
static UnlimitedAngle Parse(string angleStr)
static UnlimitedAngle operator*(double a, UnlimitedAngle b)
Kertoo kulman reaaliluvulla.
override string ToString()
Perussuunta tasossa.
Definition: Direction.cs:50
static UnlimitedAngle Sum(Angle a, UnlimitedAngle b)
Laskee yhteen rajoitetun ja rajoittamattoman kulman, palauttaen rajoittamattoman kulman.
static UnlimitedAngle Parse(string angleStr, IFormatProvider formatProvider)
static Angle FromRadians(double radian)
Luo kulman annettujen radiaanien mukaan.
Definition: Angle.cs:316
static double RadianToDegree(double radian)
Muuttaa radiaanit asteiksi.
static bool operator<=(UnlimitedAngle a, UnlimitedAngle b)
Vertaa ensimmäisen kulman suuremmuutta/yhtäsuuruutta toiseen.
override int GetHashCode()
Palauttaa kulmaa yksilöivän luvun, tässä tapauksessa kulman asteluvun.
double Radians
Palauttaa tai asettaa kulman radiaaneina.
Definition: Angle.cs:86
static UnlimitedAngle operator-(UnlimitedAngle a, UnlimitedAngle b)
Vähentää jälkimmäisen kulman ensimmäisestä.
static bool operator>(UnlimitedAngle a, UnlimitedAngle b)
Vertaa ensimmäisen kulman pienemmyyttä toiseen.
static readonly UnlimitedAngle Zero
Nollakulma.
double Degrees
Palauttaa tai asettaa kulman asteina.
static bool operator==(UnlimitedAngle a, UnlimitedAngle b)
Vertaa kahden kulman yhtäsuuruutta.
static readonly UnlimitedAngle RightAngle
Suora kulma (90 astetta).
static Direction Right
Suunta oikealle.
Definition: Direction.cs:75
static UnlimitedAngle ArcSin(double d)
Palauttaa kulman joka vastaa d:n arcus-sini.
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
2D-vektori.
Definition: Vector.cs:56
static UnlimitedAngle FromRadians(double radian)
Luo kulman annettujen radiaanien mukaan.
static UnlimitedAngle ArcCos(double d)
Palauttaa kulman joka vastaa d:n arcuskosini.
static UnlimitedAngle operator+(UnlimitedAngle a, UnlimitedAngle b)
Laskee kaksi kulmaa yhteen.
double Radians
Palauttaa tai asettaa kulman radiaaneina.
Angle Limit()
Palauttaa kulman rajoitettuna välille -180 ja 180 astetta.
static readonly UnlimitedAngle StraightAngle
Oikokulma (180 astetta).