From 1c0622d272866fa4ead4fc4b267ba94e9b663e6d Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Thu, 13 Jun 2019 13:25:34 +1000 Subject: [PATCH] Move polar<=>rect conversion to new class --- .../BizHawk.Client.Common.csproj | 2 +- .../input/PolarRectConversion.cs | 20 ++++++++++++++++++ .../controls/VirtualPadAnalogStick.cs | 21 +++++++++++-------- 3 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 BizHawk.Client.Common/input/PolarRectConversion.cs diff --git a/BizHawk.Client.Common/BizHawk.Client.Common.csproj b/BizHawk.Client.Common/BizHawk.Client.Common.csproj index cee56ac8a8..ec805f3bfe 100644 --- a/BizHawk.Client.Common/BizHawk.Client.Common.csproj +++ b/BizHawk.Client.Common/BizHawk.Client.Common.csproj @@ -142,6 +142,7 @@ + @@ -320,7 +321,6 @@ BizHawk.Bizware.BizwareGL - diff --git a/BizHawk.Client.Common/input/PolarRectConversion.cs b/BizHawk.Client.Common/input/PolarRectConversion.cs new file mode 100644 index 0000000000..7e61bbd59c --- /dev/null +++ b/BizHawk.Client.Common/input/PolarRectConversion.cs @@ -0,0 +1,20 @@ +using System; + +using DoublePair = System.Tuple; + +namespace BizHawk.Client.Common +{ + public static class PolarRectConversion + { + /// angle in degrees + /// rectangular (Cartesian) coordinates (x, y) + public static DoublePair PolarDegToRect(double r, double θ) => PolarRadToRect(r, θ * Math.PI / 180); + + /// angle in radians + /// rectangular (Cartesian) coordinates (x, y) + public static DoublePair PolarRadToRect(double r, double θ) => new DoublePair(r * Math.Cos(θ), r * Math.Sin(θ)); + + /// polar coordinates (r, θ) where θ is in degrees + public static DoublePair RectToPolarDeg(double x, double y) => new DoublePair(Math.Sqrt(x * x + y * y), Math.Atan2(y, x) * 180 / Math.PI); + } +} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/VirtualPadAnalogStick.cs b/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/VirtualPadAnalogStick.cs index 748c92e2de..7ac597052b 100644 --- a/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/VirtualPadAnalogStick.cs +++ b/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/VirtualPadAnalogStick.cs @@ -178,15 +178,17 @@ namespace BizHawk.Client.EmuHawk private void PolarNumeric_Changed(object sender, EventArgs e) { - ManualX.ValueChanged -= ManualXY_ValueChanged; + ManualX.ValueChanged -= ManualXY_ValueChanged; //TODO is setting and checking a bool faster than subscription? ManualY.ValueChanged -= ManualXY_ValueChanged; - ManualX.Value = Math.Ceiling(manualR.Value * (decimal)Math.Cos(Math.PI * (double)manualTheta.Value / 180)).Clamp(-127, 127) + rangeAverageX; - ManualY.Value = Math.Ceiling(manualR.Value * (decimal)Math.Sin(Math.PI * (double)manualTheta.Value / 180)).Clamp(-127, 127) + rangeAverageY; - - AnalogStick.X = (int)ManualX.Value; - AnalogStick.Y = (int)ManualY.Value; - + var rect = PolarRectConversion.PolarDegToRect((double) manualR.Value, (double) manualTheta.Value); + rect = new Tuple( + rangeAverageX + Math.Ceiling(rect.Item1).Clamp(-127, 127), + rangeAverageY + Math.Ceiling(rect.Item2).Clamp(-127, 127)); + ManualX.Value = (decimal) rect.Item1; + ManualY.Value = (decimal) rect.Item2; + AnalogStick.X = (int) rect.Item1; + AnalogStick.Y = (int) rect.Item2; AnalogStick.HasValue = true; AnalogStick.Refresh(); @@ -238,8 +240,9 @@ namespace BizHawk.Client.EmuHawk manualR.ValueChanged -= PolarNumeric_Changed; manualTheta.ValueChanged -= PolarNumeric_Changed; - manualR.Value = Math.Min(manualR.Value, (decimal)Math.Sqrt(Math.Pow(AnalogStick.X - rangeAverageX, 2) + Math.Pow(AnalogStick.Y - rangeAverageY, 2))); - manualTheta.Value = (decimal)(Math.Atan2(AnalogStick.Y - rangeAverageY, AnalogStick.X - rangeAverageX) * (180 / Math.PI)); + var polar = PolarRectConversion.RectToPolarDeg(AnalogStick.X - rangeAverageX, AnalogStick.Y - rangeAverageY); + manualR.Value = Math.Min(manualR.Value, (decimal) polar.Item1); //TODO bug? if not, this can be `if (polar.Item1 < manualR.Value) manualR.Value = polar.Item1;` + manualTheta.Value = (decimal) polar.Item2; manualR.ValueChanged += PolarNumeric_Changed; manualTheta.ValueChanged += PolarNumeric_Changed;