Jypeli  5
The simple game programming library
Waveform.cs
Siirry tämän tiedoston dokumentaatioon.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 
6 namespace Jypeli
7 {
11  public abstract class Waveform
12  {
16  public class Sine : Waveform
17  {
25  public Sine( double amplitude, double frequency, double phase = 0, double damping = 0 )
26  : base( amplitude, frequency, phase, damping )
27  {
28  }
29 
35  public override double GetValue( double t )
36  {
37  return Amplitude * GetDampingMultiplier( t ) * Math.Sin( 2 * Math.PI * Frequency * t + Phase );
38  }
39 
46  public override double GetDerivative( double t, double dt )
47  {
48  return Amplitude * GetDampingMultiplier( t ) * ( 2 * Math.PI * Frequency ) * Math.Cos( 2 * Math.PI * Frequency * t + Phase );
49  }
50  }
51 
55  public class Saw : Waveform
56  {
64  public Saw( double amplitude, double frequency, double phase = 0, double damping = 0 )
65  : base( amplitude, frequency, phase, damping )
66  {
67  }
68 
74  public override double GetValue( double t )
75  {
76  double ft = Frequency * t;
77  return Amplitude * GetDampingMultiplier( t ) * Math.Sin( 2 * ( ft - Math.Floor( ft ) ) - 1 + Phase );
78  }
79  }
80 
84  public class Triangle : Waveform
85  {
93  public Triangle( double amplitude, double frequency, double phase = 0, double damping = 0 )
94  : base( amplitude, frequency, phase, damping )
95  {
96  }
97 
103  public override double GetValue( double t )
104  {
105  double ft = Frequency * t;
106  return Amplitude * GetDampingMultiplier( t ) * Math.Sin( ( ft - 2 * Math.Floor( ( ft + 1 ) / 2 ) ) * Math.Pow( -1, Math.Floor( ( ft + 1 ) / 2 ) ) + Phase );
107  }
108  }
109 
113  public class Square : Waveform
114  {
122  public Square( double amplitude, double frequency, double phase = 0, double damping = 0 )
123  : base( amplitude, frequency, phase, damping )
124  {
125  }
126 
132  public override double GetValue( double t )
133  {
134  if ( t == 0 ) return 0;
135  return Amplitude * GetDampingMultiplier( t ) * Math.Sign( Math.Sin( 2 * Math.PI * Frequency * t + Phase ) );
136  }
137  }
138 
142  public double Amplitude { get; set; }
143 
147  public double Frequency { get; set; }
148 
152  public double Phase { get; set; }
153 
157  public double Damping { get; set; }
158 
166  protected Waveform( double amplitude, double frequency, double phase, double damping )
167  {
168  this.Amplitude = amplitude;
169  this.Frequency = frequency;
170  this.Phase = phase;
171  this.Damping = damping;
172  }
173 
179  public abstract double GetValue( double t );
180 
191  public virtual double GetDerivative( double t, double dt )
192  {
193  double y_prev = GetValue( t - dt );
194  double y_now = GetValue( t );
195  return ( y_now - y_prev ) / dt;
196  }
197 
204  public double GetDampingMultiplier( double t )
205  {
206  return Math.Pow( Math.E, -Damping * t );
207  }
208  }
209 }
Aaltomuoto.
Definition: Waveform.cs:11
Sahalaita-aalto.
Definition: Waveform.cs:55
virtual double GetDerivative(double t, double dt)
Palauttaa poikkeaman muutoksen eli värähtelijän nopeuden hetkellä t.
Definition: Waveform.cs:191
double Damping
Vaimenemisvakio. Jos 0, värähtely jatkuu ikuisesti.
Definition: Waveform.cs:157
Saw(double amplitude, double frequency, double phase=0, double damping=0)
Luo uuden sahalaita-aallon.
Definition: Waveform.cs:64
double Amplitude
Amplitudi eli maksimipoikkeama keskipisteestä.
Definition: Waveform.cs:142
double GetDampingMultiplier(double t)
Palauttaa vaimenemiskertoimen hetkellä t. Vaimenemiskerroin on eri asia kuin vaimenemisvakio ja riipp...
Definition: Waveform.cs:204
Siniaalto.
Definition: Waveform.cs:16
double Phase
Vaihe. Vaihteluväli on 0 - 2 * Math.PI.
Definition: Waveform.cs:152
override double GetValue(double t)
Palauttaa poikkeaman keskipisteestä hetkellä t.
Definition: Waveform.cs:74
override double GetValue(double t)
Palauttaa poikkeaman keskipisteestä hetkellä t.
Definition: Waveform.cs:103
override double GetDerivative(double t, double dt)
Palauttaa poikkeaman muutoksen eli värähtelijän nopeuden hetkellä t.
Definition: Waveform.cs:46
double Frequency
Taajuus (jaksoa sekunnissa)
Definition: Waveform.cs:147
override double GetValue(double t)
Palauttaa poikkeaman keskipisteestä hetkellä t.
Definition: Waveform.cs:35
Square(double amplitude, double frequency, double phase=0, double damping=0)
Luo uuden kanttiaallon.
Definition: Waveform.cs:122
Waveform(double amplitude, double frequency, double phase, double damping)
Luo uuden aaltomuodon.
Definition: Waveform.cs:166
override double GetValue(double t)
Palauttaa poikkeaman keskipisteestä hetkellä t.
Definition: Waveform.cs:132
Triangle(double amplitude, double frequency, double phase=0, double damping=0)
Luo uuden kolmioaallon.
Definition: Waveform.cs:93
Kanttiaalto.
Definition: Waveform.cs:113
Sine(double amplitude, double frequency, double phase=0, double damping=0)
Luo uuden siniaallon.
Definition: Waveform.cs:25