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