diff options
| author | Jacob Palecki <[email protected]> | 2020-08-12 19:51:38 -0700 |
|---|---|---|
| committer | Jacob Palecki <[email protected]> | 2020-08-12 19:51:38 -0700 |
| commit | b6254f32a6cfbd40bd1919950b344160f38bf1e4 (patch) | |
| tree | 82a2a514f90b9781062b2919e2b17c4cc6f852bc /grapher/Models/Calculations | |
| parent | Reorganized solution into directories (diff) | |
| download | rawaccel-b6254f32a6cfbd40bd1919950b344160f38bf1e4.tar.xz rawaccel-b6254f32a6cfbd40bd1919950b344160f38bf1e4.zip | |
Factor accel calculations into calculation classes
Diffstat (limited to 'grapher/Models/Calculations')
| -rw-r--r-- | grapher/Models/Calculations/AccelCalculator.cs | 91 | ||||
| -rw-r--r-- | grapher/Models/Calculations/AccelData.cs | 32 |
2 files changed, 123 insertions, 0 deletions
diff --git a/grapher/Models/Calculations/AccelCalculator.cs b/grapher/Models/Calculations/AccelCalculator.cs new file mode 100644 index 0000000..2d8d892 --- /dev/null +++ b/grapher/Models/Calculations/AccelCalculator.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace grapher.Models.Calculations +{ + public static class AccelCalculator + { + public struct MagnitudeData + { + public double magnitude; + public int x; + public int y; + } + + public static ReadOnlyCollection<MagnitudeData> Magnitudes = GetMagnitudes(); + + public static void Calculate(AccelData data, ManagedAccel accel, double starter) + { + data.Clear(); + + double lastInputMagnitude = 0; + double lastOutputMagnitude = 0; + + foreach (var magnitudeData in Magnitudes) + { + var output = accel.Accelerate(magnitudeData.x, magnitudeData.y, 1); + + var outMagnitude = Magnitude(output.Item1, output.Item2); + var ratio = magnitudeData.magnitude > 0 ? outMagnitude / magnitudeData.magnitude : starter; + + var inDiff = magnitudeData.magnitude - lastInputMagnitude; + var outDiff = outMagnitude - lastOutputMagnitude; + var slope = inDiff > 0 ? outDiff / inDiff : starter; + + if (!data.OrderedAccelPoints.ContainsKey(magnitudeData.magnitude)) + { + data.OrderedAccelPoints.Add(magnitudeData.magnitude, ratio); + } + + if (!data.OrderedVelocityPoints.ContainsKey(magnitudeData.magnitude)) + { + data.OrderedVelocityPoints.Add(magnitudeData.magnitude, outMagnitude); + } + + if (!data.OrderedGainPoints.ContainsKey(magnitudeData.magnitude)) + { + data.OrderedGainPoints.Add(magnitudeData.magnitude, slope); + } + + lastInputMagnitude = magnitudeData.magnitude; + lastOutputMagnitude = outMagnitude; + } + + } + + public static ReadOnlyCollection<MagnitudeData> GetMagnitudes() + { + var magnitudes = new List<MagnitudeData>(); + for (int i = 0; i < 100; i++) + { + for (int j = 0; j <= i; j++) + { + MagnitudeData magnitudeData; + magnitudeData.magnitude = Magnitude(i, j); + magnitudeData.x = i; + magnitudeData.y = j; + magnitudes.Add(magnitudeData); + } + } + + magnitudes.Sort((m1, m2) => m1.magnitude.CompareTo(m2.magnitude)); + + return magnitudes.AsReadOnly(); + } + + public static double Magnitude(int x, int y) + { + return Math.Sqrt(x * x + y * y); + } + + public static double Magnitude(double x, double y) + { + return Math.Sqrt(x * x + y * y); + } + + } +} diff --git a/grapher/Models/Calculations/AccelData.cs b/grapher/Models/Calculations/AccelData.cs new file mode 100644 index 0000000..d304660 --- /dev/null +++ b/grapher/Models/Calculations/AccelData.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace grapher.Models.Calculations +{ + public class AccelData + { + public AccelData() + { + OrderedAccelPoints = new SortedDictionary<double, double>(); + OrderedVelocityPoints = new SortedDictionary<double, double>(); + OrderedGainPoints = new SortedDictionary<double, double>(); + } + + public SortedDictionary<double, double> OrderedAccelPoints { get; } + + public SortedDictionary<double, double> OrderedVelocityPoints { get; } + + public SortedDictionary<double, double> OrderedGainPoints { get; } + + public void Clear() + { + OrderedAccelPoints.Clear(); + OrderedVelocityPoints.Clear(); + OrderedGainPoints.Clear(); + } + + } +} |