Jypeli 10
The simple game programming library
Oscillator.cs
Siirry tämän tiedoston dokumentaatioon.
1using System;
2using System.Collections.Generic;
3
4namespace Jypeli.GameObjects
5{
9 internal abstract class Oscillator : Updatable, Destroyable
10 {
11 protected double t = 0;
12
14 public double Frequency;
15 public double Phase;
16 public double Damping;
17
18 public bool IsUpdated { get { return true; } }
19 public bool IsDestroyed { get; private set; }
20
21 public double W { get => 2 * Math.PI * Frequency; }
22
23 public event Action Destroyed;
24
25 public Oscillator( IGameObject obj, double f, double phase, double damping )
26 {
27 this.Object = obj;
28 this.Frequency = f;
29 this.Phase = phase;
30 this.Damping = damping;
31 }
32
33 public double GetDampingMultiplier()
34 {
35 return Math.Pow( Math.E, -Damping * t );
36 }
37
38 public void Update( Time time )
39 {
40 t += time.SinceLastUpdate.TotalSeconds;
41
42 if ( GetDampingMultiplier() < 1e-12 )
43 {
44 Stop();
45 Destroy();
46 }
47
48 Apply();
49 }
50
51 protected abstract void Apply();
52
53 public void Destroy()
54 {
55 IsDestroyed = true;
56 if ( Destroyed != null ) Destroyed();
57 }
58
59 public abstract void Stop();
60 }
61
66 {
67 public Vector Center;
68 public Vector Axis;
69 public double Amplitude;
70
71 public LinearOscillator( IGameObject obj, Vector axis, double a, double f, double phase, double damping )
72 : base( obj, f, phase, damping )
73 {
74 this.Axis = axis.Normalize();
75 this.Amplitude = a;
76 this.Center = obj.Position - Axis * Amplitude * Math.Sin( phase );
77
78 if ( Object is IPhysicsObject )
79 {
80 ( (IPhysicsObject)obj ).Velocity = Axis * Amplitude * 2 * Math.PI * f * Math.Cos( phase );
81 }
82 }
83
85 {
86 return Axis * Amplitude * GetDampingMultiplier() * Math.Sin(W * t + Phase);
87 }
88
90 {
91 return Axis * Amplitude * W * GetDampingMultiplier() * Math.Cos(W * t + Phase);
92 }
93
95 {
96 return obj is IPhysicsObject objp && objp.Mass != 0;
97 }
98
99 protected override void Apply()
100 {
101 if ( IsDynamic( Object ) )
102 {
104 double d = ( Object.Position - Center ).ScalarProjection(Axis);
105 double angularFreq = 2 * Math.PI * Frequency;
106 double k = Math.Pow( angularFreq, 2 ) * physObj.Mass;
107 double force = -k * d;
108 double dampingForce = physObj.Velocity.ScalarProjection(Axis) * Damping * physObj.Mass;
109 double totalForce = force - dampingForce;
110
111 physObj.Push( totalForce * Axis );
112 }else if(Object is PhysicsObject obj)
113 {
114 obj.Velocity = GetVelocity();
115 }
116 else
117 {
119 }
120 }
121
122 public override void Stop()
123 {
124 if ( Object is IPhysicsObject )
125 {
126 ( (IPhysicsObject)Object ).StopAxial( Axis );
127 }
128 }
129 }
130
135 {
136 public double Direction;
137 public Angle Center;
139
140 public AngularOscillator( IGameObject obj, double dir, UnlimitedAngle a, double f, double damping )
141 : base( obj, f, 0, damping )
142 {
143 this.Direction = Math.Sign( dir );
144 this.Amplitude = a;
145 this.Center = obj.Angle;
146 }
147
149 {
150 return Direction * Amplitude * GetDampingMultiplier() * Math.Cos(W * t + Phase);
151 }
152
154 {
155 return obj is IPhysicsObject objp && objp.MomentOfInertia != 0;
156 }
157
158 public double GetAngularVelocity()
159 {
160 return -W * Amplitude.Radians * Math.Sin(W * t + Phase);
161 }
162
163 List<double> lista = new List<double>();
164 List<double> lista2 = new List<double>();
165
166 protected override void Apply()
167 {
168 if (IsDynamic(Object))
169 {
171 double d = Math.Cos(W * t + Phase);
172 double k = physObj.MomentOfInertia * Math.Pow(W, 2) * Amplitude.Radians;
173 double torque = -k * d;
174 double dampingTorque = physObj.AngularVelocity * Damping * physObj.MomentOfInertia;
175 double totalTorque = torque - dampingTorque;
176
177 physObj.ApplyTorque(totalTorque);
178 lista.Add(totalTorque);
179 lista2.Add(physObj.AngularVelocity);
180 }
181 else if (Object is PhysicsObject obj)
182 {
183 obj.AngularVelocity = GetAngularVelocity();
184 }
185 else
186 {
188 }
189 }
190
191 public override void Stop()
192 {
193 if ( Object is IPhysicsObject )
194 {
195 ( (IPhysicsObject)Object ).StopAngular();
196 }
197 }
198 }
199}
Harmoninen värähtelijä pyörintäliikkeelle.
Definition: Oscillator.cs:135
bool IsDynamic(IGameObject obj)
Definition: Oscillator.cs:153
AngularOscillator(IGameObject obj, double dir, UnlimitedAngle a, double f, double damping)
Definition: Oscillator.cs:140
Harmoninen värähtelijä akselin suhteen.
Definition: Oscillator.cs:66
LinearOscillator(IGameObject obj, Vector axis, double a, double f, double phase, double damping)
Definition: Oscillator.cs:71
bool IsDynamic(IGameObject obj)
Definition: Oscillator.cs:94
Harmoninen värähtelijä.
Definition: Oscillator.cs:10
void Destroy()
Tuhoaa kappaleen
Definition: Oscillator.cs:53
Oscillator(IGameObject obj, double f, double phase, double damping)
Definition: Oscillator.cs:25
void Update(Time time)
Päivitysfunktio
Definition: Oscillator.cs:38
Kappale joka noudattaa fysiikan lakeja, johon voi törmätä. Vaatii että käytössä on fysiikkapeli.
Definition: Collisions.cs:7
Rajapinta olioille, jotka ovat tuhottavissa.
Definition: Destroyable.cs:9
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:11
Yhteinen rajapinta kaikille fysiikkaolioille.
void Push(Vector force)
void ApplyTorque(double torque)
new Vector Position
Paikka.
Definition: Positional.cs:32
Rajapinta päivittyville olioille.
Definition: Updatable.cs:7
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
static Angle Sum(UnlimitedAngle a, Angle b)
Laskee yhteen rajoittamattoman ja rajoitetun kulman, palauttaen rajoitetun kulman.
Definition: Angle.cs:285
Perussuunta tasossa.
Definition: Direction.cs:47
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:14
TimeSpan SinceLastUpdate
Aika joka on kulunut viime päivityksestä.
Definition: Time.cs:27
Rajoittamaton kulma (asteina ja radiaaneina). Tietoja kulmasta: http://en.wikipedia....
double Radians
Palauttaa tai asettaa kulman radiaaneina.
2D-vektori.
Definition: Vector.cs:67
Vector Normalize()
Palauttaa uuden vektorin, jonka suunta pysyy samana, mutta pituudeksi tulee 1.0.
Definition: Vector.cs:217
double ScalarProjection(Vector vector)
Skalaariprojektio annettuun vektoriin https://en.wikipedia.org/wiki/Scalar_projection
Definition: Vector.cs:200