From b6254f32a6cfbd40bd1919950b344160f38bf1e4 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Wed, 12 Aug 2020 19:51:38 -0700 Subject: Factor accel calculations into calculation classes --- grapher/Models/Calculations/AccelCalculator.cs | 91 ++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 grapher/Models/Calculations/AccelCalculator.cs (limited to 'grapher/Models/Calculations/AccelCalculator.cs') 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 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 GetMagnitudes() + { + var magnitudes = new List(); + 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); + } + + } +} -- cgit v1.2.3 From 30e1391b224ae028f4476e06a07415a0285ac6c9 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Wed, 12 Aug 2020 20:39:53 -0700 Subject: Almost working --- grapher/Models/Calculations/AccelCalculator.cs | 71 +++++++++++++++++++++----- 1 file changed, 57 insertions(+), 14 deletions(-) (limited to 'grapher/Models/Calculations/AccelCalculator.cs') diff --git a/grapher/Models/Calculations/AccelCalculator.cs b/grapher/Models/Calculations/AccelCalculator.cs index 2d8d892..a768ee9 100644 --- a/grapher/Models/Calculations/AccelCalculator.cs +++ b/grapher/Models/Calculations/AccelCalculator.cs @@ -9,6 +9,9 @@ namespace grapher.Models.Calculations { public static class AccelCalculator { + public const int MaxCombined = 100; + public const int MaxXY = 150; + public struct MagnitudeData { public double magnitude; @@ -16,51 +19,59 @@ namespace grapher.Models.Calculations public int y; } - public static ReadOnlyCollection Magnitudes = GetMagnitudes(); + public static ReadOnlyCollection MagnitudesCombined = GetMagnitudes(); + public static ReadOnlyCollection MagnitudesX = GetMagnitudesX(); + public static ReadOnlyCollection MagnitudesY = GetMagnitudesY(); public static void Calculate(AccelData data, ManagedAccel accel, double starter) { data.Clear(); + Calculate(data.Combined, accel, starter, MagnitudesCombined); + Calculate(data.X, accel, starter, MagnitudesX); + Calculate(data.Y, accel, starter, MagnitudesY); + } + + public static void Calculate(AccelChartData data, ManagedAccel accel, double starter, ICollection magnitudeData) + { double lastInputMagnitude = 0; double lastOutputMagnitude = 0; - foreach (var magnitudeData in Magnitudes) + foreach (var magnitudeDatum in MagnitudesCombined) { - var output = accel.Accelerate(magnitudeData.x, magnitudeData.y, 1); + var output = accel.Accelerate(magnitudeDatum.x, magnitudeDatum.y, 1); var outMagnitude = Magnitude(output.Item1, output.Item2); - var ratio = magnitudeData.magnitude > 0 ? outMagnitude / magnitudeData.magnitude : starter; + var ratio = magnitudeDatum.magnitude > 0 ? outMagnitude / magnitudeDatum.magnitude : starter; - var inDiff = magnitudeData.magnitude - lastInputMagnitude; + var inDiff = magnitudeDatum.magnitude - lastInputMagnitude; var outDiff = outMagnitude - lastOutputMagnitude; var slope = inDiff > 0 ? outDiff / inDiff : starter; - if (!data.OrderedAccelPoints.ContainsKey(magnitudeData.magnitude)) + if (!data.AccelPoints.ContainsKey(magnitudeDatum.magnitude)) { - data.OrderedAccelPoints.Add(magnitudeData.magnitude, ratio); + data.AccelPoints.Add(magnitudeDatum.magnitude, ratio); } - if (!data.OrderedVelocityPoints.ContainsKey(magnitudeData.magnitude)) + if (!data.VelocityPoints.ContainsKey(magnitudeDatum.magnitude)) { - data.OrderedVelocityPoints.Add(magnitudeData.magnitude, outMagnitude); + data.VelocityPoints.Add(magnitudeDatum.magnitude, outMagnitude); } - if (!data.OrderedGainPoints.ContainsKey(magnitudeData.magnitude)) + if (!data.GainPoints.ContainsKey(magnitudeDatum.magnitude)) { - data.OrderedGainPoints.Add(magnitudeData.magnitude, slope); + data.GainPoints.Add(magnitudeDatum.magnitude, slope); } - lastInputMagnitude = magnitudeData.magnitude; + lastInputMagnitude = magnitudeDatum.magnitude; lastOutputMagnitude = outMagnitude; } - } public static ReadOnlyCollection GetMagnitudes() { var magnitudes = new List(); - for (int i = 0; i < 100; i++) + for (int i = 0; i < MaxCombined; i++) { for (int j = 0; j <= i; j++) { @@ -77,6 +88,38 @@ namespace grapher.Models.Calculations return magnitudes.AsReadOnly(); } + public static ReadOnlyCollection GetMagnitudesX() + { + var magnitudes = new List(); + + for (int i = 0; i < MaxXY; i++) + { + MagnitudeData magnitudeData; + magnitudeData.magnitude = i; + magnitudeData.x = i; + magnitudeData.y = 0; + magnitudes.Add(magnitudeData); + } + + return magnitudes.AsReadOnly(); + } + + public static ReadOnlyCollection GetMagnitudesY() + { + var magnitudes = new List(); + + for (int i = 0; i < MaxXY; i++) + { + MagnitudeData magnitudeData; + magnitudeData.magnitude = i; + magnitudeData.x = 0; + magnitudeData.y = i; + magnitudes.Add(magnitudeData); + } + + return magnitudes.AsReadOnly(); + } + public static double Magnitude(int x, int y) { return Math.Sqrt(x * x + y * y); -- cgit v1.2.3 From 93a22c08b3223b040c3a3644fc3c4ef82fc576f0 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Thu, 13 Aug 2020 01:52:49 -0700 Subject: Dot to show mouse move --- grapher/Models/Calculations/AccelCalculator.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'grapher/Models/Calculations/AccelCalculator.cs') diff --git a/grapher/Models/Calculations/AccelCalculator.cs b/grapher/Models/Calculations/AccelCalculator.cs index a768ee9..d61a59b 100644 --- a/grapher/Models/Calculations/AccelCalculator.cs +++ b/grapher/Models/Calculations/AccelCalculator.cs @@ -23,13 +23,13 @@ namespace grapher.Models.Calculations public static ReadOnlyCollection MagnitudesX = GetMagnitudesX(); public static ReadOnlyCollection MagnitudesY = GetMagnitudesY(); - public static void Calculate(AccelData data, ManagedAccel accel, double starter) + public static void Calculate(AccelData data, ManagedAccel accel, double starterX, double starterY) { data.Clear(); - Calculate(data.Combined, accel, starter, MagnitudesCombined); - Calculate(data.X, accel, starter, MagnitudesX); - Calculate(data.Y, accel, starter, MagnitudesY); + Calculate(data.Combined, accel, starterX, MagnitudesCombined); + Calculate(data.X, accel, starterY, MagnitudesX); + Calculate(data.Y, accel, starterY, MagnitudesY); } public static void Calculate(AccelChartData data, ManagedAccel accel, double starter, ICollection magnitudeData) @@ -37,7 +37,7 @@ namespace grapher.Models.Calculations double lastInputMagnitude = 0; double lastOutputMagnitude = 0; - foreach (var magnitudeDatum in MagnitudesCombined) + foreach (var magnitudeDatum in magnitudeData) { var output = accel.Accelerate(magnitudeDatum.x, magnitudeDatum.y, 1); -- cgit v1.2.3 From 6602649bd7f9a9849b25fe55a5e5e8a617f40b70 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Thu, 13 Aug 2020 13:39:40 -0700 Subject: All works smoothly --- grapher/Models/Calculations/AccelCalculator.cs | 2 ++ 1 file changed, 2 insertions(+) (limited to 'grapher/Models/Calculations/AccelCalculator.cs') diff --git a/grapher/Models/Calculations/AccelCalculator.cs b/grapher/Models/Calculations/AccelCalculator.cs index d61a59b..e194854 100644 --- a/grapher/Models/Calculations/AccelCalculator.cs +++ b/grapher/Models/Calculations/AccelCalculator.cs @@ -66,6 +66,8 @@ namespace grapher.Models.Calculations lastInputMagnitude = magnitudeDatum.magnitude; lastOutputMagnitude = outMagnitude; } + + data.OrderedVelocityPointsList.AddRange(data.VelocityPoints.Values.ToList()); } public static ReadOnlyCollection GetMagnitudes() -- cgit v1.2.3 From 32323636b4b5390c114fc2a6d845b7621a983cdc Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Thu, 13 Aug 2020 20:56:41 -0700 Subject: Fix initial points, add poll time constant --- grapher/Models/Calculations/AccelCalculator.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'grapher/Models/Calculations/AccelCalculator.cs') diff --git a/grapher/Models/Calculations/AccelCalculator.cs b/grapher/Models/Calculations/AccelCalculator.cs index e194854..bba3c32 100644 --- a/grapher/Models/Calculations/AccelCalculator.cs +++ b/grapher/Models/Calculations/AccelCalculator.cs @@ -23,13 +23,13 @@ namespace grapher.Models.Calculations public static ReadOnlyCollection MagnitudesX = GetMagnitudesX(); public static ReadOnlyCollection MagnitudesY = GetMagnitudesY(); - public static void Calculate(AccelData data, ManagedAccel accel, double starterX, double starterY) + public static void Calculate(AccelData data, ManagedAccel accel) { data.Clear(); - Calculate(data.Combined, accel, starterX, MagnitudesCombined); - Calculate(data.X, accel, starterY, MagnitudesX); - Calculate(data.Y, accel, starterY, MagnitudesY); + Calculate(data.Combined, accel, accel.GetSensitivityX(), MagnitudesCombined); + Calculate(data.X, accel, accel.GetSensitivityX(), MagnitudesX); + Calculate(data.Y, accel, accel.GetSensitivityY(), MagnitudesY); } public static void Calculate(AccelChartData data, ManagedAccel accel, double starter, ICollection magnitudeData) @@ -132,5 +132,14 @@ namespace grapher.Models.Calculations return Math.Sqrt(x * x + y * y); } + public static double Velocity(int x, int y, double time) + { + return Magnitude(x, y) / time; + } + + public static double Velocity(double x, double y, double time) + { + return Magnitude(x, y) / time; + } } } -- cgit v1.2.3