Jypeli  9
The simple game programming library
Oscillator.cs
Siirry tämän tiedoston dokumentaatioon.
1 using System;
2 
3 namespace Jypeli.GameObjects
4 {
8  internal abstract class Oscillator : Updatable, Destroyable
9  {
10  protected double t = 0;
11 
13  public double Frequency;
14  public double Phase;
15  public double Damping;
16 
17  public bool IsUpdated { get { return true; } }
18  public bool IsDestroyed { get; private set; }
19 
20  public event Action Destroyed;
21 
22  public Oscillator( IGameObject obj, double f, double phase, double damping )
23  {
24  this.Object = obj;
25  this.Frequency = f;
26  this.Phase = phase;
27  this.Damping = damping;
28  }
29 
30  public double GetDampingMultiplier()
31  {
32  return Math.Pow( Math.E, -Damping * t );
33  }
34 
35  public void Update( Time time )
36  {
37  t += time.SinceLastUpdate.TotalSeconds;
38 
39  if ( GetDampingMultiplier() < 1e-12 )
40  {
41  Stop();
42  Destroy();
43  }
44 
45  Apply();
46  }
47 
48  protected abstract void Apply();
49 
50  public void Destroy()
51  {
52  IsDestroyed = true;
53  if ( Destroyed != null ) Destroyed();
54  }
55 
56  public abstract void Stop();
57  }
58 
62  internal class LinearOscillator : Oscillator
63  {
64  public Vector Center;
65  public Vector Axis;
66  public double Amplitude;
67 
68  public LinearOscillator( IGameObject obj, Vector axis, double a, double f, double phase, double damping )
69  : base( obj, f, phase, damping )
70  {
71  this.Axis = axis.Normalize();
72  this.Amplitude = a;
73  this.Center = obj.Position - Axis * Amplitude * Math.Sin( phase );
74 
75  if ( Object is IPhysicsObject )
76  {
77  ( (IPhysicsObject)obj ).Velocity = Axis * Amplitude * 2 * Math.PI * f * Math.Cos( phase );
78  }
79  }
80 
81  public Vector GetOffset()
82  {
83  return Axis * Amplitude * GetDampingMultiplier() * Math.Sin( 2 * Math.PI * Frequency * t + Phase );
84  }
85 
86  bool IsDynamic( IGameObject obj )
87  {
88  return obj is IPhysicsObject && !double.IsInfinity( ( (IPhysicsObject)obj ).Mass );
89  }
90 
91  protected override void Apply()
92  {
93  if ( IsDynamic( Object ) )
94  {
96  double d = ( Object.Position - Center ).ScalarProjection( Axis );
97  double angularFreq = 2 * Math.PI * Frequency;
98  double k = Math.Pow( angularFreq, 2 ) * physObj.Mass;
99  double force = -k * d;
100  double dampingForce = physObj.Velocity.ScalarProjection( Axis ) * Damping * physObj.Mass;
101  double totalForce = force - dampingForce;
102 
103  physObj.Push( totalForce * Axis );
104  }
105  else
106  {
108  }
109  }
110 
111  public override void Stop()
112  {
113  if ( Object is IPhysicsObject )
114  {
115  ( (IPhysicsObject)Object ).StopAxial( Axis );
116  }
117  }
118  }
119 
123  internal class AngularOscillator : Oscillator
124  {
125  public double Direction;
126  public Angle Center;
128 
129  public AngularOscillator( IGameObject obj, double dir, UnlimitedAngle a, double f, double damping )
130  : base( obj, f, 0, damping )
131  {
132  this.Direction = Math.Sign( dir );
133  this.Amplitude = a;
134  this.Center = obj.Angle;
135 
136  if ( Object is IPhysicsObject )
137  {
138  ( (IPhysicsObject)obj ).AngularVelocity = Direction * 2 * Amplitude.Radians * f;
139  }
140  }
141 
143  {
144  return Direction * Amplitude * GetDampingMultiplier() * Math.Sin( 2 * Math.PI * Frequency * t + Phase );
145  }
146 
147  bool IsDynamic( IGameObject obj )
148  {
149  return obj is IPhysicsObject && !double.IsInfinity( ( (IPhysicsObject)obj ).MomentOfInertia );
150  }
151 
152  protected override void Apply()
153  {
154  if ( IsDynamic( Object ) )
155  {
157  double d = Math.PI * ( Object.Angle.Radians - Center.Radians );
158  double k = Math.Pow( Frequency, 2 ) * physObj.MomentOfInertia;
159  double torque = -k * d;
160  double dampingTorque = physObj.AngularVelocity * Damping * physObj.MomentOfInertia;
161  double totalTorque = torque - dampingTorque;
162 
163  physObj.ApplyTorque( totalTorque );
164  }
165  else
166  {
168  }
169  }
170 
171  public override void Stop()
172  {
173  if ( Object is IPhysicsObject )
174  {
175  ( (IPhysicsObject)Object ).StopAngular();
176  }
177  }
178  }
179 }
Jypeli.GameObjects.LinearOscillator.LinearOscillator
LinearOscillator(IGameObject obj, Vector axis, double a, double f, double phase, double damping)
Definition: Oscillator.cs:68
Jypeli.GameObjects.AngularOscillator.AngularOscillator
AngularOscillator(IGameObject obj, double dir, UnlimitedAngle a, double f, double damping)
Definition: Oscillator.cs:129
Jypeli.GameObjects.Oscillator.t
double t
Definition: Oscillator.cs:10
Jypeli.GameObjects.Oscillator.Apply
abstract void Apply()
Jypeli.IPhysicsObject.Velocity
Vector Velocity
Definition: IPhysicsObject.cs:28
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.GameObjects.LinearOscillator.Stop
override void Stop()
Definition: Oscillator.cs:111
Jypeli.GameObjects.LinearOscillator
Harmoninen värähtelijä akselin suhteen.
Definition: Oscillator.cs:63
Jypeli.IGameObject
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:11
Jypeli.Vector.ScalarProjection
double ScalarProjection(Vector unitVector)
Definition: Vector.cs:181
Jypeli.Angle.Radians
double Radians
Palauttaa tai asettaa kulman radiaaneina.
Definition: Angle.cs:85
Jypeli.GameObjects.Oscillator.IsUpdated
bool IsUpdated
Definition: Oscillator.cs:17
Jypeli.GameObjects
Definition: GameObjectBase.cs:5
Jypeli.GameObjects.LinearOscillator.Center
Vector Center
Definition: Oscillator.cs:64
Jypeli.GameObjects.Oscillator.Stop
abstract void Stop()
Jypeli.IPhysicsObject
Yhteinen rajapinta kaikille fysiikkaolioille.
Definition: IPhysicsObject.cs:12
Jypeli.GameObjects.LinearOscillator.IsDynamic
bool IsDynamic(IGameObject obj)
Definition: Oscillator.cs:86
Jypeli.GameObjects.LinearOscillator.Amplitude
double Amplitude
Definition: Oscillator.cs:66
Jypeli.GameObjects.Oscillator.Oscillator
Oscillator(IGameObject obj, double f, double phase, double damping)
Definition: Oscillator.cs:22
Jypeli.Updatable
Rajapinta päivittyville olioille.
Definition: Updatable.cs:7
Jypeli.GameObjects.AngularOscillator.Direction
double Direction
Definition: Oscillator.cs:125
Jypeli.GameObjects.AngularOscillator.Center
Angle Center
Definition: Oscillator.cs:126
Jypeli.UnlimitedAngle.Radians
double Radians
Palauttaa tai asettaa kulman radiaaneina.
Definition: UnlimitedAngle.cs:89
Jypeli.IPhysicsObject.Push
void Push(Vector force)
Jypeli.GameObjects.AngularOscillator
Harmoninen värähtelijä pyörintäliikkeelle.
Definition: Oscillator.cs:124
Jypeli.GameObjects.AngularOscillator.Amplitude
UnlimitedAngle Amplitude
Definition: Oscillator.cs:127
Jypeli.Time
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:14
Jypeli.GameObjects.Oscillator.Damping
double Damping
Definition: Oscillator.cs:15
Jypeli.GameObjects.Oscillator.Update
void Update(Time time)
Definition: Oscillator.cs:35
Jypeli.GameObjects.AngularOscillator.GetOffset
UnlimitedAngle GetOffset()
Definition: Oscillator.cs:142
Jypeli.GameObjects.AngularOscillator.Apply
override void Apply()
Definition: Oscillator.cs:152
Jypeli.Destroyable
Rajapinta olioille, jotka ovat tuhottavissa.
Definition: Destroyable.cs:9
Jypeli.PositionalRW.Position
new Vector Position
Paikka.
Definition: Positional.cs:32
Jypeli.Time.SinceLastUpdate
TimeSpan SinceLastUpdate
Aika joka on kulunut viime päivityksestä.
Definition: Time.cs:24
Jypeli.IPhysicsObject.MomentOfInertia
double MomentOfInertia
Definition: IPhysicsObject.cs:21
Jypeli.GameObjects.LinearOscillator.Apply
override void Apply()
Definition: Oscillator.cs:91
Jypeli.Angle.Sum
static Angle Sum(UnlimitedAngle a, Angle b)
Laskee yhteen rajoittamattoman ja rajoitetun kulman, palauttaen rajoitetun kulman.
Definition: Angle.cs:285
Jypeli.IPhysicsObject.Mass
double Mass
Definition: IPhysicsObject.cs:20
Jypeli.GameObjects.Oscillator.Destroy
void Destroy()
Definition: Oscillator.cs:50
Jypeli.Vector
2D-vektori.
Definition: Vector.cs:59
Jypeli.IPhysicsObject.AngularVelocity
double AngularVelocity
Definition: IPhysicsObject.cs:30
System
Definition: CFFauxAttributes.cs:29
Jypeli.GameObjects.Oscillator.Object
IGameObject Object
Definition: Oscillator.cs:12
Jypeli.IGameObject.Angle
Angle Angle
Definition: IGameObject.cs:27
Jypeli.GameObjects.LinearOscillator.GetOffset
Vector GetOffset()
Definition: Oscillator.cs:81
Jypeli.GameObjects.Oscillator.IsDestroyed
bool IsDestroyed
Definition: Oscillator.cs:18
Jypeli.Vector.Normalize
Vector Normalize()
Palauttaa uuden vektorin, jonka suunta pysyy samana, mutta pituudeksi tulee 1.0.
Definition: Vector.cs:198
Jypeli.GameObjects.Oscillator.GetDampingMultiplier
double GetDampingMultiplier()
Definition: Oscillator.cs:30
Jypeli.IPhysicsObject.ApplyTorque
void ApplyTorque(double torque)
Jypeli.GameObjects.LinearOscillator.Axis
Vector Axis
Definition: Oscillator.cs:65
Jypeli.GameObjects.Oscillator.Destroyed
Action Destroyed
Definition: Oscillator.cs:20
Jypeli.GameObjects.Oscillator
Harmoninen värähtelijä.
Definition: Oscillator.cs:9
Jypeli.GameObjects.Oscillator.Phase
double Phase
Definition: Oscillator.cs:14
Jypeli.GameObjects.Oscillator.Frequency
double Frequency
Definition: Oscillator.cs:13
Jypeli.Angle
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
Jypeli.GameObjects.AngularOscillator.Stop
override void Stop()
Definition: Oscillator.cs:171
Jypeli.GameObjects.AngularOscillator.IsDynamic
bool IsDynamic(IGameObject obj)
Definition: Oscillator.cs:147