From 8c55ca08881b59943bc9dda193107cc8a117cf69 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Mon, 18 Jan 2021 17:39:10 -0800 Subject: Refactor for new graph calculation method --- grapher/Models/Calculations/AccelCalculator.cs | 73 ++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) (limited to 'grapher/Models/Calculations/AccelCalculator.cs') diff --git a/grapher/Models/Calculations/AccelCalculator.cs b/grapher/Models/Calculations/AccelCalculator.cs index 2c32753..f59a0fa 100644 --- a/grapher/Models/Calculations/AccelCalculator.cs +++ b/grapher/Models/Calculations/AccelCalculator.cs @@ -14,12 +14,24 @@ namespace grapher.Models.Calculations { public double velocity; public double time; + public double angle; public int x; public int y; } #endregion Structs + #region Static + + public static double[] SlowMovements = + { + 0,0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.333, 3.666, 4.0, 4.333, 4.666, + }; + + public IEnumerable Angles = GetAngles(); + + #endregion static + #region Constructors public AccelCalculator(Field dpi, Field pollRate) @@ -58,6 +70,14 @@ namespace grapher.Models.Calculations #region Methods + public static IEnumerable GetAngles() + { + for(int i=0; i<19; i++) + { + yield return (i / 18) * (Math.PI / 2); + } + } + public void Calculate(AccelChartData data, ManagedAccel accel, double starter, ICollection simulatedInputData) { double lastInputMagnitude = 0; @@ -316,6 +336,7 @@ namespace grapher.Models.Calculations mouseInputData.y = j; mouseInputData.time = MeasurementTime; mouseInputData.velocity = Velocity(i, j, mouseInputData.time); + mouseInputData.angle = Math.Atan2(j,i); magnitudes.Add(mouseInputData); } } @@ -336,6 +357,7 @@ namespace grapher.Models.Calculations mouseInputData.y = 0; mouseInputData.time = MeasurementTime; mouseInputData.velocity = Velocity(i, 0, mouseInputData.time); + mouseInputData.angle = 0; magnitudes.Add(mouseInputData); } @@ -353,12 +375,63 @@ namespace grapher.Models.Calculations mouseInputData.y = i; mouseInputData.time = MeasurementTime; mouseInputData.velocity = Velocity(0, i, mouseInputData.time); + mouseInputData.angle = Math.PI / 2; magnitudes.Add(mouseInputData); } return magnitudes.AsReadOnly(); } + public ReadOnlyCollection GetSimulatedInputXY() + { + var magnitudes = new List(); + + foreach (var slowMoveMagnitude in SlowMovements) + { + foreach (var slowAngle in Angles) + { + var slowMoveX = slowMoveMagnitude * Math.Cos(slowAngle); + var slowMoveY = slowMoveMagnitude * Math.Sin(slowAngle); + var ceilX = (int)Math.Ceiling(slowMoveX); + var ceilY = (int)Math.Ceiling(slowMoveY); + var magnitude = Magnitude(slowMoveX, slowMoveY); + var ceilMagnitude = Magnitude(ceilX, ceilY); + var timeFactor = ceilMagnitude / magnitude; + + SimulatedMouseInput mouseInputData; + mouseInputData.x = ceilX; + mouseInputData.y = ceilY; + mouseInputData.time = timeFactor; + mouseInputData.velocity = Velocity(ceilX, ceilY, timeFactor); + mouseInputData.angle = slowAngle; + magnitudes.Add(mouseInputData); + } + } + + for (int magnitude = 5; magnitude < XYMaxVelocity; magnitude+=Increment) + { + foreach (var angle in Angles) + { + var slowMoveX = magnitude * Math.Cos(angle); + var slowMoveY = magnitude * Math.Sin(angle); + var ceilX = (int)Math.Ceiling(slowMoveX); + var ceilY = (int)Math.Ceiling(slowMoveY); + var ceilMagnitude = Magnitude(ceilX, ceilY); + var timeFactor = ceilMagnitude / magnitude; + + SimulatedMouseInput mouseInputData; + mouseInputData.x =ceilX; + mouseInputData.y = ceilY; + mouseInputData.time = MeasurementTime; + mouseInputData.velocity = Velocity(ceilX, ceilY, mouseInputData.time); + mouseInputData.angle = angle; + magnitudes.Add(mouseInputData); + } + } + + return magnitudes.AsReadOnly(); + } + public static double Magnitude(int x, int y) { return Math.Sqrt(x * x + y * y); -- cgit v1.2.3 From 4faf0007c7c551fae8fd25fc7a98767070cb9244 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Mon, 18 Jan 2021 22:02:29 -0800 Subject: Directional works --- grapher/Models/Calculations/AccelCalculator.cs | 300 +++++++++++-------------- 1 file changed, 134 insertions(+), 166 deletions(-) (limited to 'grapher/Models/Calculations/AccelCalculator.cs') diff --git a/grapher/Models/Calculations/AccelCalculator.cs b/grapher/Models/Calculations/AccelCalculator.cs index f59a0fa..260d137 100644 --- a/grapher/Models/Calculations/AccelCalculator.cs +++ b/grapher/Models/Calculations/AccelCalculator.cs @@ -25,7 +25,7 @@ namespace grapher.Models.Calculations public static double[] SlowMovements = { - 0,0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.333, 3.666, 4.0, 4.333, 4.666, + 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.333, 3.666, 4.0, 4.333, 4.666, }; public IEnumerable Angles = GetAngles(); @@ -50,6 +50,8 @@ namespace grapher.Models.Calculations public ReadOnlyCollection SimulatedInputY { get; private set; } + public IReadOnlyCollection> SimulatedDirectionalInput { get; private set; } + public Field DPI { get; private set; } public Field PollRate { get; private set; } @@ -72,12 +74,18 @@ namespace grapher.Models.Calculations public static IEnumerable GetAngles() { - for(int i=0; i<19; i++) + for(double i=0; i < (Constants.AngleDivisions); i++) { - yield return (i / 18) * (Math.PI / 2); + yield return (i / (Constants.AngleDivisions-1.0)) * (Math.PI / 2); } } + public static int NearestAngleDivision(double angle) + { + var angleTransformed = angle * 2 / Math.PI * (Constants.AngleDivisions-1); + return (int)Math.Round(angleTransformed); + } + public void Calculate(AccelChartData data, ManagedAccel accel, double starter, ICollection simulatedInputData) { double lastInputMagnitude = 0; @@ -174,12 +182,8 @@ namespace grapher.Models.Calculations data.MinGain = minSlope; } - public void CalculateCombinedDiffSens(AccelData data, ManagedAccel accel, DriverSettings settings, ICollection simulatedInputData) + public void CalculateCombinedDiffSens(AccelChartData[] dataByAngle, ManagedAccel accel, DriverSettings settings, IReadOnlyCollection> simulatedInputData) { - double lastInputMagnitude = 0; - double lastOutputMagnitudeX = 0; - double lastOutputMagnitudeY = 0; - double maxRatio = 0.0; double minRatio = Double.MaxValue; double maxSlope = 0.0; @@ -188,140 +192,101 @@ namespace grapher.Models.Calculations Sensitivity = GetSens(ref settings); - double log = -2; - int index = 0; - int logIndex = 0; + int angleIndex = 0; - foreach (var simulatedInputDatum in simulatedInputData) + foreach (var simulatedInputDataAngle in simulatedInputData) { - if (simulatedInputDatum.velocity <= 0) - { - continue; - } - - var output = accel.Accelerate(simulatedInputDatum.x, simulatedInputDatum.y, simulatedInputDatum.time); - var outputWithoutSens = StripThisSens(output.Item1, output.Item2); - var magnitudeWithoutSens = Velocity(outputWithoutSens.Item1, outputWithoutSens.Item2, simulatedInputDatum.time); + double log = -2; + int index = 0; + int logIndex = 0; + double lastInputMagnitude = 0; + double lastOutputMagnitude = 0; - var ratio = magnitudeWithoutSens / simulatedInputDatum.velocity; + var data = dataByAngle[angleIndex]; - if (!data.Combined.VelocityPoints.ContainsKey(simulatedInputDatum.velocity)) + foreach (var simulatedInputDatum in simulatedInputDataAngle) { - data.Combined.VelocityPoints.Add(simulatedInputDatum.velocity, magnitudeWithoutSens); - } - else - { - continue; + if (simulatedInputDatum.velocity <= 0) + { + continue; + } + + var output = accel.Accelerate(simulatedInputDatum.x, simulatedInputDatum.y, simulatedInputDatum.time); + var magnitude = Velocity(output.Item1, output.Item2, simulatedInputDatum.time); + + var ratio = magnitude / simulatedInputDatum.velocity; + + if (!data.VelocityPoints.ContainsKey(simulatedInputDatum.velocity)) + { + data.VelocityPoints.Add(simulatedInputDatum.velocity, magnitude); + } + else + { + continue; + } + + while (Math.Pow(10, log) < magnitude && logIndex < data.LogToIndex.Length) + { + data.LogToIndex[logIndex] = index; + log += 0.01; + logIndex++; + } + + if (ratio > maxRatio) + { + maxRatio = ratio; + } + + if (ratio < minRatio) + { + minRatio = ratio; + } + + var inDiff = simulatedInputDatum.velocity - lastInputMagnitude; + var outDiff = magnitude - lastOutputMagnitude; + var slope = inDiff > 0 ? outDiff / inDiff : settings.sensitivity.x; + + if (slope > maxSlope) + { + maxSlope = slope; + } + + if (slope < minSlope) + { + minSlope = slope; + } + + if (!data.AccelPoints.ContainsKey(simulatedInputDatum.velocity)) + { + data.AccelPoints.Add(simulatedInputDatum.velocity, ratio); + } + + if (!data.GainPoints.ContainsKey(simulatedInputDatum.velocity)) + { + data.GainPoints.Add(simulatedInputDatum.velocity, slope); + } + + lastInputMagnitude = simulatedInputDatum.velocity; + lastOutputMagnitude = magnitude; + index += 1; } - while (Math.Pow(10,log) < magnitudeWithoutSens && logIndex < data.Combined.LogToIndex.Length) + index--; + + while (log <= 5.0) { - data.Combined.LogToIndex[logIndex] = index; + data.LogToIndex[logIndex] = index; log += 0.01; logIndex++; } - var xRatio = settings.sensitivity.x * ratio; - var yRatio = settings.sensitivity.y * ratio; - - if (xRatio > maxRatio) - { - maxRatio = xRatio; - } - - if (xRatio < minRatio) - { - minRatio = xRatio; - } - - if (yRatio > maxRatio) - { - maxRatio = yRatio; - } - - if (yRatio < minRatio) - { - minRatio = yRatio; - } - - if (!data.X.AccelPoints.ContainsKey(simulatedInputDatum.velocity)) - { - data.X.AccelPoints.Add(simulatedInputDatum.velocity, xRatio); - } - - if (!data.Y.AccelPoints.ContainsKey(simulatedInputDatum.velocity)) - { - data.Y.AccelPoints.Add(simulatedInputDatum.velocity, yRatio); - } - - var xOut = xRatio * simulatedInputDatum.velocity; - var yOut = yRatio * simulatedInputDatum.velocity; - - var inDiff = simulatedInputDatum.velocity - lastInputMagnitude; - var xOutDiff = xOut - lastOutputMagnitudeX; - var yOutDiff = yOut - lastOutputMagnitudeY; - var xSlope = inDiff > 0 ? xOutDiff / inDiff : settings.sensitivity.x; - var ySlope = inDiff > 0 ? yOutDiff / inDiff : settings.sensitivity.y; - - if (xSlope > maxSlope) - { - maxSlope = xSlope; - } - - if (xSlope < minSlope) - { - minSlope = xSlope; - } - - if (ySlope > maxSlope) - { - maxSlope = ySlope; - } - - if (ySlope < minSlope) - { - minSlope = ySlope; - } - - if (!data.X.VelocityPoints.ContainsKey(simulatedInputDatum.velocity)) - { - data.X.VelocityPoints.Add(simulatedInputDatum.velocity, xOut); - } - - if (!data.Y.VelocityPoints.ContainsKey(simulatedInputDatum.velocity)) - { - data.Y.VelocityPoints.Add(simulatedInputDatum.velocity, yOut); - } - - if (!data.X.GainPoints.ContainsKey(simulatedInputDatum.velocity)) - { - data.X.GainPoints.Add(simulatedInputDatum.velocity, xSlope); - } - - if (!data.Y.GainPoints.ContainsKey(simulatedInputDatum.velocity)) - { - data.Y.GainPoints.Add(simulatedInputDatum.velocity, ySlope); - } - - lastInputMagnitude = simulatedInputDatum.velocity; - lastOutputMagnitudeX = xOut; - lastOutputMagnitudeY = yOut; - index += 1; + angleIndex++; } - index--; - - while (log <= 5.0) - { - data.Combined.LogToIndex[logIndex] = index; - log += 0.01; - logIndex++; - } - - data.Combined.MaxAccel = maxRatio; - data.Combined.MinAccel = minRatio; - data.Combined.MaxGain = maxSlope; - data.Combined.MinGain = minSlope; + dataByAngle[0].MaxAccel = maxRatio; + dataByAngle[0].MinAccel = minRatio; + dataByAngle[0].MaxGain = maxSlope; + dataByAngle[0].MinGain = minSlope; } public ReadOnlyCollection GetSimulatedInput() @@ -382,54 +347,56 @@ namespace grapher.Models.Calculations return magnitudes.AsReadOnly(); } - public ReadOnlyCollection GetSimulatedInputXY() + public IReadOnlyCollection> GetSimulatedDirectionalInput() { - var magnitudes = new List(); + var magnitudesByAngle = new List>(); - foreach (var slowMoveMagnitude in SlowMovements) + foreach (var angle in Angles) { - foreach (var slowAngle in Angles) - { - var slowMoveX = slowMoveMagnitude * Math.Cos(slowAngle); - var slowMoveY = slowMoveMagnitude * Math.Sin(slowAngle); - var ceilX = (int)Math.Ceiling(slowMoveX); - var ceilY = (int)Math.Ceiling(slowMoveY); - var magnitude = Magnitude(slowMoveX, slowMoveY); - var ceilMagnitude = Magnitude(ceilX, ceilY); - var timeFactor = ceilMagnitude / magnitude; + var magnitudes = new List(); - SimulatedMouseInput mouseInputData; - mouseInputData.x = ceilX; - mouseInputData.y = ceilY; - mouseInputData.time = timeFactor; - mouseInputData.velocity = Velocity(ceilX, ceilY, timeFactor); - mouseInputData.angle = slowAngle; - magnitudes.Add(mouseInputData); + foreach (var slowMoveMagnitude in SlowMovements) + { + var slowMoveX = Math.Round(slowMoveMagnitude * Math.Cos(angle), 4); + var slowMoveY = Math.Round(slowMoveMagnitude * Math.Sin(angle), 4); + var ratio = slowMoveX > 0.0 ? slowMoveY / slowMoveX : 90; + var ceilX = (int)Math.Round(slowMoveX*90); + var ceilY = (int)Math.Round(slowMoveY*ratio); + var ceilMagnitude = Magnitude(ceilX, ceilY); + var timeFactor = ceilMagnitude / slowMoveMagnitude; + + SimulatedMouseInput mouseInputData; + mouseInputData.x = ceilX; + mouseInputData.y = ceilY; + mouseInputData.time = timeFactor; + mouseInputData.velocity = Velocity(ceilX, ceilY, timeFactor); + mouseInputData.angle = angle; + magnitudes.Add(mouseInputData); } - } - for (int magnitude = 5; magnitude < XYMaxVelocity; magnitude+=Increment) - { - foreach (var angle in Angles) + for (int magnitude = 5; magnitude < XYMaxVelocity; magnitude+=Increment) { - var slowMoveX = magnitude * Math.Cos(angle); - var slowMoveY = magnitude * Math.Sin(angle); - var ceilX = (int)Math.Ceiling(slowMoveX); - var ceilY = (int)Math.Ceiling(slowMoveY); - var ceilMagnitude = Magnitude(ceilX, ceilY); - var timeFactor = ceilMagnitude / magnitude; - - SimulatedMouseInput mouseInputData; - mouseInputData.x =ceilX; - mouseInputData.y = ceilY; - mouseInputData.time = MeasurementTime; - mouseInputData.velocity = Velocity(ceilX, ceilY, mouseInputData.time); - mouseInputData.angle = angle; - magnitudes.Add(mouseInputData); + var slowMoveX = Math.Round(magnitude * Math.Cos(angle), 4); + var slowMoveY = Math.Round(magnitude * Math.Sin(angle), 4); + var ratio = slowMoveX > 0.0 ? slowMoveY / slowMoveX : 90; + var ceilX = (int)Math.Round(slowMoveX*90); + var ceilY = (int)Math.Round(slowMoveY*ratio); + var ceilMagnitude = Magnitude(ceilX, ceilY); + var timeFactor = ceilMagnitude / magnitude; + + SimulatedMouseInput mouseInputData; + mouseInputData.x = ceilX; + mouseInputData.y = ceilY; + mouseInputData.time = timeFactor; + mouseInputData.velocity = Velocity(ceilX, ceilY, mouseInputData.time); + mouseInputData.angle = angle; + magnitudes.Add(mouseInputData); } + + magnitudesByAngle.Add(magnitudes.AsReadOnly()); } - return magnitudes.AsReadOnly(); + return magnitudesByAngle.AsReadOnly(); } public static double Magnitude(int x, int y) @@ -487,6 +454,7 @@ namespace grapher.Models.Calculations SimulatedInputCombined = GetSimulatedInput(); SimulatedInputX = GetSimulatInputX(); SimulatedInputY = GetSimulatedInputY(); + SimulatedDirectionalInput = GetSimulatedDirectionalInput(); } #endregion Methods -- cgit v1.2.3 From 74de604f28a70b2ab444e6ba53979ea94e3b8d23 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Tue, 19 Jan 2021 00:30:53 -0800 Subject: Mostly working --- grapher/Models/Calculations/AccelCalculator.cs | 78 +++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 9 deletions(-) (limited to 'grapher/Models/Calculations/AccelCalculator.cs') diff --git a/grapher/Models/Calculations/AccelCalculator.cs b/grapher/Models/Calculations/AccelCalculator.cs index 260d137..a3b8e07 100644 --- a/grapher/Models/Calculations/AccelCalculator.cs +++ b/grapher/Models/Calculations/AccelCalculator.cs @@ -90,6 +90,8 @@ namespace grapher.Models.Calculations { double lastInputMagnitude = 0; double lastOutputMagnitude = 0; + SimulatedMouseInput lastInput; + double lastSlope = 0; double maxRatio = 0.0; double minRatio = Double.MaxValue; @@ -109,6 +111,14 @@ namespace grapher.Models.Calculations var output = accel.Accelerate(simulatedInputDatum.x, simulatedInputDatum.y, simulatedInputDatum.time); var outMagnitude = Velocity(output.Item1, output.Item2, simulatedInputDatum.time); + var inDiff = Math.Round(simulatedInputDatum.velocity - lastInputMagnitude, 5); + var outDiff = Math.Round(outMagnitude - lastOutputMagnitude, 5); + var slope = inDiff > 0 ? outDiff / inDiff : starter; + + if (inDiff <= 0) + { + continue; + } if (!data.VelocityPoints.ContainsKey(simulatedInputDatum.velocity)) { @@ -138,10 +148,6 @@ namespace grapher.Models.Calculations minRatio = ratio; } - var inDiff = simulatedInputDatum.velocity - lastInputMagnitude; - var outDiff = outMagnitude - lastOutputMagnitude; - var slope = inDiff > 0 ? outDiff / inDiff : starter; - if (slope > maxSlope) { maxSlope = slope; @@ -165,6 +171,8 @@ namespace grapher.Models.Calculations lastInputMagnitude = simulatedInputDatum.velocity; lastOutputMagnitude = outMagnitude; index += 1; + lastInput = simulatedInputDatum; + lastSlope = slope; } index--; @@ -292,7 +300,34 @@ namespace grapher.Models.Calculations public ReadOnlyCollection GetSimulatedInput() { var magnitudes = new List(); - for (int i = 0; i < CombinedMaxVelocity; i+=Increment) + + foreach (var slowMoveX in SlowMovements) + { + foreach (var slowMoveY in SlowMovements) + { + if (slowMoveY >= slowMoveX) + { + continue; + } + + var ratio = slowMoveX > 0.0 ? slowMoveY / slowMoveX : 1; + var ceilX = (int)Math.Round(slowMoveX*50); + var ceilY = (int)Math.Round(slowMoveY*50); + var ceilMagnitude = Magnitude(ceilX, ceilY); + var timeFactor = ceilMagnitude / Magnitude(slowMoveX, slowMoveY); + + SimulatedMouseInput mouseInputData; + mouseInputData.x = ceilX; + mouseInputData.y = ceilY; + mouseInputData.time = MeasurementTime*timeFactor; + mouseInputData.velocity = Velocity(ceilX, ceilY, mouseInputData.time); + mouseInputData.angle = Math.Atan2(ceilY, ceilX); + magnitudes.Add(mouseInputData); + + } + } + + for (int i = 5; i < CombinedMaxVelocity; i+=Increment) { for (int j = 0; j <= i; j+=Increment) { @@ -315,7 +350,20 @@ namespace grapher.Models.Calculations { var magnitudes = new List(); - for (int i = 0; i < XYMaxVelocity; i+=Increment) + foreach (var slowMovement in SlowMovements) + { + var ceil = (int)Math.Ceiling(slowMovement); + var timeFactor = ceil / slowMovement; + SimulatedMouseInput mouseInputData; + mouseInputData.x = ceil; + mouseInputData.y = 0; + mouseInputData.time = MeasurementTime*timeFactor; + mouseInputData.velocity = Velocity(ceil, 0, mouseInputData.time); + mouseInputData.angle = 0; + magnitudes.Add(mouseInputData); + } + + for (int i = 5; i < XYMaxVelocity; i+=Increment) { SimulatedMouseInput mouseInputData; mouseInputData.x = i; @@ -333,7 +381,20 @@ namespace grapher.Models.Calculations { var magnitudes = new List(); - for (int i = 0; i < XYMaxVelocity; i+=Increment) + foreach (var slowMovement in SlowMovements) + { + var ceil = (int)Math.Ceiling(slowMovement); + var timeFactor = ceil / slowMovement; + SimulatedMouseInput mouseInputData; + mouseInputData.x = 0; + mouseInputData.y = ceil; + mouseInputData.time = MeasurementTime*timeFactor; + mouseInputData.velocity = Velocity(0, ceil, mouseInputData.time); + mouseInputData.angle = 0; + magnitudes.Add(mouseInputData); + } + + for (int i = 5; i < XYMaxVelocity; i+=Increment) { SimulatedMouseInput mouseInputData; mouseInputData.x = 0; @@ -359,9 +420,8 @@ namespace grapher.Models.Calculations { var slowMoveX = Math.Round(slowMoveMagnitude * Math.Cos(angle), 4); var slowMoveY = Math.Round(slowMoveMagnitude * Math.Sin(angle), 4); - var ratio = slowMoveX > 0.0 ? slowMoveY / slowMoveX : 90; var ceilX = (int)Math.Round(slowMoveX*90); - var ceilY = (int)Math.Round(slowMoveY*ratio); + var ceilY = (int)Math.Round(slowMoveY*90); var ceilMagnitude = Magnitude(ceilX, ceilY); var timeFactor = ceilMagnitude / slowMoveMagnitude; -- cgit v1.2.3 From 376e48c82ce992fd35aef927bbff9753f3547951 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Tue, 19 Jan 2021 00:31:11 -0800 Subject: further tweaks --- grapher/Models/Calculations/AccelCalculator.cs | 52 +++++++++++--------------- 1 file changed, 21 insertions(+), 31 deletions(-) (limited to 'grapher/Models/Calculations/AccelCalculator.cs') diff --git a/grapher/Models/Calculations/AccelCalculator.cs b/grapher/Models/Calculations/AccelCalculator.cs index a3b8e07..ffe8444 100644 --- a/grapher/Models/Calculations/AccelCalculator.cs +++ b/grapher/Models/Calculations/AccelCalculator.cs @@ -113,7 +113,6 @@ namespace grapher.Models.Calculations var outMagnitude = Velocity(output.Item1, output.Item2, simulatedInputDatum.time); var inDiff = Math.Round(simulatedInputDatum.velocity - lastInputMagnitude, 5); var outDiff = Math.Round(outMagnitude - lastOutputMagnitude, 5); - var slope = inDiff > 0 ? outDiff / inDiff : starter; if (inDiff <= 0) { @@ -137,6 +136,7 @@ namespace grapher.Models.Calculations } var ratio = outMagnitude / simulatedInputDatum.velocity; + var slope = inDiff > 0 ? outDiff / inDiff : starter; if (ratio > maxRatio) { @@ -303,42 +303,32 @@ namespace grapher.Models.Calculations foreach (var slowMoveX in SlowMovements) { - foreach (var slowMoveY in SlowMovements) - { - if (slowMoveY >= slowMoveX) - { - continue; - } - - var ratio = slowMoveX > 0.0 ? slowMoveY / slowMoveX : 1; - var ceilX = (int)Math.Round(slowMoveX*50); - var ceilY = (int)Math.Round(slowMoveY*50); - var ceilMagnitude = Magnitude(ceilX, ceilY); - var timeFactor = ceilMagnitude / Magnitude(slowMoveX, slowMoveY); + var slowMoveY = slowMoveX; + var ratio = slowMoveX > 0.0 ? slowMoveY / slowMoveX : 1; + var ceilX = (int)Math.Round(slowMoveX*50); + var ceilY = (int)Math.Round(slowMoveY*50); + var ceilMagnitude = Magnitude(ceilX, ceilY); + var timeFactor = ceilMagnitude / Magnitude(slowMoveX, slowMoveY); - SimulatedMouseInput mouseInputData; - mouseInputData.x = ceilX; - mouseInputData.y = ceilY; - mouseInputData.time = MeasurementTime*timeFactor; - mouseInputData.velocity = Velocity(ceilX, ceilY, mouseInputData.time); - mouseInputData.angle = Math.Atan2(ceilY, ceilX); - magnitudes.Add(mouseInputData); + SimulatedMouseInput mouseInputData; + mouseInputData.x = ceilX; + mouseInputData.y = ceilY; + mouseInputData.time = MeasurementTime*timeFactor; + mouseInputData.velocity = Velocity(ceilX, ceilY, mouseInputData.time); + mouseInputData.angle = Math.Atan2(ceilY, ceilX); + magnitudes.Add(mouseInputData); - } } for (int i = 5; i < CombinedMaxVelocity; i+=Increment) { - for (int j = 0; j <= i; j+=Increment) - { - SimulatedMouseInput mouseInputData; - mouseInputData.x = i; - mouseInputData.y = j; - mouseInputData.time = MeasurementTime; - mouseInputData.velocity = Velocity(i, j, mouseInputData.time); - mouseInputData.angle = Math.Atan2(j,i); - magnitudes.Add(mouseInputData); - } + SimulatedMouseInput mouseInputData; + mouseInputData.x = i; + mouseInputData.y = i; + mouseInputData.time = MeasurementTime; + mouseInputData.velocity = Velocity(i, i, mouseInputData.time); + mouseInputData.angle = Math.Atan2(i,i); + magnitudes.Add(mouseInputData); } magnitudes.Sort((m1, m2) => m1.velocity.CompareTo(m2.velocity)); -- cgit v1.2.3 From 9c2be5743fb44e8a68084ac0bd15c02f6cce637a Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Wed, 20 Jan 2021 00:30:50 -0800 Subject: Final graph fidelity tweaks and fixes --- grapher/Models/Calculations/AccelCalculator.cs | 53 +++++++++++++++----------- 1 file changed, 30 insertions(+), 23 deletions(-) (limited to 'grapher/Models/Calculations/AccelCalculator.cs') diff --git a/grapher/Models/Calculations/AccelCalculator.cs b/grapher/Models/Calculations/AccelCalculator.cs index ffe8444..733a3c0 100644 --- a/grapher/Models/Calculations/AccelCalculator.cs +++ b/grapher/Models/Calculations/AccelCalculator.cs @@ -56,9 +56,7 @@ namespace grapher.Models.Calculations public Field PollRate { get; private set; } - private double CombinedMaxVelocity { get; set; } - - private double XYMaxVelocity { get; set; } + private double MaxVelocity { get; set; } private int Increment { get; set; } @@ -114,7 +112,7 @@ namespace grapher.Models.Calculations var inDiff = Math.Round(simulatedInputDatum.velocity - lastInputMagnitude, 5); var outDiff = Math.Round(outMagnitude - lastOutputMagnitude, 5); - if (inDiff <= 0) + if (inDiff == 0) { continue; } @@ -137,7 +135,7 @@ namespace grapher.Models.Calculations var ratio = outMagnitude / simulatedInputDatum.velocity; var slope = inDiff > 0 ? outDiff / inDiff : starter; - + if (ratio > maxRatio) { maxRatio = ratio; @@ -190,7 +188,7 @@ namespace grapher.Models.Calculations data.MinGain = minSlope; } - public void CalculateCombinedDiffSens(AccelChartData[] dataByAngle, ManagedAccel accel, DriverSettings settings, IReadOnlyCollection> simulatedInputData) + public void CalculateDirectional(AccelChartData[] dataByAngle, ManagedAccel accel, DriverSettings settings, IReadOnlyCollection> simulatedInputData) { double maxRatio = 0.0; double minRatio = Double.MaxValue; @@ -221,8 +219,18 @@ namespace grapher.Models.Calculations var output = accel.Accelerate(simulatedInputDatum.x, simulatedInputDatum.y, simulatedInputDatum.time); var magnitude = Velocity(output.Item1, output.Item2, simulatedInputDatum.time); + var inDiff = Math.Round(simulatedInputDatum.velocity - lastInputMagnitude, 5); + var outDiff = Math.Round(magnitude - lastOutputMagnitude, 5); - var ratio = magnitude / simulatedInputDatum.velocity; + if (inDiff == 0) + { + continue; + } + + if (inDiff < 0 || outDiff < 0) + { + Console.WriteLine(string.Empty); + } if (!data.VelocityPoints.ContainsKey(simulatedInputDatum.velocity)) { @@ -240,26 +248,27 @@ namespace grapher.Models.Calculations logIndex++; } - if (ratio > maxRatio) + var ratio = magnitude / simulatedInputDatum.velocity; + var slope = inDiff > 0 ? outDiff / inDiff : settings.sensitivity.x; + + bool indexToMeasureExtrema = (angleIndex == 0) || (angleIndex == (Constants.AngleDivisions - 1)); + + if (indexToMeasureExtrema && (ratio > maxRatio)) { maxRatio = ratio; } - if (ratio < minRatio) + if (indexToMeasureExtrema && (ratio < minRatio)) { minRatio = ratio; } - var inDiff = simulatedInputDatum.velocity - lastInputMagnitude; - var outDiff = magnitude - lastOutputMagnitude; - var slope = inDiff > 0 ? outDiff / inDiff : settings.sensitivity.x; - - if (slope > maxSlope) + if (indexToMeasureExtrema && (slope > maxSlope)) { maxSlope = slope; } - if (slope < minSlope) + if (indexToMeasureExtrema && (slope < minSlope)) { minSlope = slope; } @@ -320,7 +329,7 @@ namespace grapher.Models.Calculations } - for (int i = 5; i < CombinedMaxVelocity; i+=Increment) + for (int i = 5; i < MaxVelocity; i+=Increment) { SimulatedMouseInput mouseInputData; mouseInputData.x = i; @@ -353,7 +362,7 @@ namespace grapher.Models.Calculations magnitudes.Add(mouseInputData); } - for (int i = 5; i < XYMaxVelocity; i+=Increment) + for (int i = 5; i < MaxVelocity; i+=Increment) { SimulatedMouseInput mouseInputData; mouseInputData.x = i; @@ -384,7 +393,7 @@ namespace grapher.Models.Calculations magnitudes.Add(mouseInputData); } - for (int i = 5; i < XYMaxVelocity; i+=Increment) + for (int i = 5; i < MaxVelocity; i+=Increment) { SimulatedMouseInput mouseInputData; mouseInputData.x = 0; @@ -424,7 +433,7 @@ namespace grapher.Models.Calculations magnitudes.Add(mouseInputData); } - for (int magnitude = 5; magnitude < XYMaxVelocity; magnitude+=Increment) + for (int magnitude = 5; magnitude < MaxVelocity; magnitude+=Increment) { var slowMoveX = Math.Round(magnitude * Math.Cos(angle), 4); var slowMoveY = Math.Round(magnitude * Math.Sin(angle), 4); @@ -495,12 +504,10 @@ namespace grapher.Models.Calculations public void ScaleByMouseSettings() { - var dpiPollFactor = DPI.Data / PollRate.Data; - CombinedMaxVelocity = dpiPollFactor * Constants.MaxMultiplier; - var ratio = CombinedMaxVelocity / Constants.Resolution; + MaxVelocity = DPI.Data * Constants.MaxMultiplier; + var ratio = MaxVelocity / Constants.Resolution; Increment = ratio > 1 ? (int) Math.Floor(ratio) : 1; MeasurementTime = Increment == 1 ? 1 / ratio : 1; - XYMaxVelocity = CombinedMaxVelocity * Constants.XYToCombinedRatio; SimulatedInputCombined = GetSimulatedInput(); SimulatedInputX = GetSimulatInputX(); SimulatedInputY = GetSimulatedInputY(); -- cgit v1.2.3 From 3bab172f863390a3930ada35173b5c943db9489a Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Wed, 20 Jan 2021 00:32:51 -0800 Subject: Remove debug statement --- grapher/Models/Calculations/AccelCalculator.cs | 5 ----- 1 file changed, 5 deletions(-) (limited to 'grapher/Models/Calculations/AccelCalculator.cs') diff --git a/grapher/Models/Calculations/AccelCalculator.cs b/grapher/Models/Calculations/AccelCalculator.cs index 733a3c0..3787291 100644 --- a/grapher/Models/Calculations/AccelCalculator.cs +++ b/grapher/Models/Calculations/AccelCalculator.cs @@ -227,11 +227,6 @@ namespace grapher.Models.Calculations continue; } - if (inDiff < 0 || outDiff < 0) - { - Console.WriteLine(string.Empty); - } - if (!data.VelocityPoints.ContainsKey(simulatedInputDatum.velocity)) { data.VelocityPoints.Add(simulatedInputDatum.velocity, magnitude); -- cgit v1.2.3 From 6046120f67327411eafa9c6a9fa0601c2ea5c554 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Wed, 20 Jan 2021 18:25:31 -0800 Subject: Tweaks --- grapher/Models/Calculations/AccelCalculator.cs | 38 +++++++++++++++----------- 1 file changed, 22 insertions(+), 16 deletions(-) (limited to 'grapher/Models/Calculations/AccelCalculator.cs') diff --git a/grapher/Models/Calculations/AccelCalculator.cs b/grapher/Models/Calculations/AccelCalculator.cs index 3787291..42b7347 100644 --- a/grapher/Models/Calculations/AccelCalculator.cs +++ b/grapher/Models/Calculations/AccelCalculator.cs @@ -58,7 +58,7 @@ namespace grapher.Models.Calculations private double MaxVelocity { get; set; } - private int Increment { get; set; } + private double Increment { get; set; } private double MeasurementTime { get; set; } @@ -324,14 +324,16 @@ namespace grapher.Models.Calculations } - for (int i = 5; i < MaxVelocity; i+=Increment) + for (double i = 5; i < MaxVelocity; i+=Increment) { SimulatedMouseInput mouseInputData; - mouseInputData.x = i; - mouseInputData.y = i; - mouseInputData.time = MeasurementTime; - mouseInputData.velocity = Velocity(i, i, mouseInputData.time); - mouseInputData.angle = Math.Atan2(i,i); + var ceil = (int)Math.Ceiling(i); + var timeFactor = ceil / i; + mouseInputData.x = ceil; + mouseInputData.y = 0; + mouseInputData.time = MeasurementTime * timeFactor; + mouseInputData.velocity = Velocity(ceil, 0, mouseInputData.time); + mouseInputData.angle = Math.Atan2(ceil, 0); magnitudes.Add(mouseInputData); } @@ -357,13 +359,15 @@ namespace grapher.Models.Calculations magnitudes.Add(mouseInputData); } - for (int i = 5; i < MaxVelocity; i+=Increment) + for (double i = 5; i < MaxVelocity; i+=Increment) { SimulatedMouseInput mouseInputData; - mouseInputData.x = i; + var ceil = (int)Math.Ceiling(i); + var timeFactor = ceil / i; + mouseInputData.x = ceil; mouseInputData.y = 0; - mouseInputData.time = MeasurementTime; - mouseInputData.velocity = Velocity(i, 0, mouseInputData.time); + mouseInputData.time = MeasurementTime*timeFactor; + mouseInputData.velocity = Velocity(ceil, 0, mouseInputData.time); mouseInputData.angle = 0; magnitudes.Add(mouseInputData); } @@ -388,11 +392,13 @@ namespace grapher.Models.Calculations magnitudes.Add(mouseInputData); } - for (int i = 5; i < MaxVelocity; i+=Increment) + for (double i = 5; i < MaxVelocity; i+=Increment) { SimulatedMouseInput mouseInputData; + var ceil = (int)Math.Ceiling(i); + var timeFactor = ceil / i; mouseInputData.x = 0; - mouseInputData.y = i; + mouseInputData.y = ceil; mouseInputData.time = MeasurementTime; mouseInputData.velocity = Velocity(0, i, mouseInputData.time); mouseInputData.angle = Math.PI / 2; @@ -428,7 +434,7 @@ namespace grapher.Models.Calculations magnitudes.Add(mouseInputData); } - for (int magnitude = 5; magnitude < MaxVelocity; magnitude+=Increment) + for (double magnitude = 5; magnitude < MaxVelocity; magnitude+=Increment) { var slowMoveX = Math.Round(magnitude * Math.Cos(angle), 4); var slowMoveY = Math.Round(magnitude * Math.Sin(angle), 4); @@ -501,8 +507,8 @@ namespace grapher.Models.Calculations { MaxVelocity = DPI.Data * Constants.MaxMultiplier; var ratio = MaxVelocity / Constants.Resolution; - Increment = ratio > 1 ? (int) Math.Floor(ratio) : 1; - MeasurementTime = Increment == 1 ? 1 / ratio : 1; + Increment = ratio; + MeasurementTime = 1; SimulatedInputCombined = GetSimulatedInput(); SimulatedInputX = GetSimulatInputX(); SimulatedInputY = GetSimulatedInputY(); -- cgit v1.2.3