C# 如何从x轴和y轴找到圆的角度
请随意标记我的问题重复。因为我对COS,SIN,TAN一无所知,其他人可能已经问过这个问题了 所以,我尝试设置基于x轴和y轴的圆形进度条,这可以从gamepad输入中获得。进度条将其简化为最小值为0,最大值为360 我确实试着搜索了一下,但我最好的理解是它只能在180度和正x和y的情况下工作。但是我从控制器得到的输入是,y从-1到1(其中x-1是左,1是右,y-1是底部,1是顶部) 这是到目前为止我的代码C# 如何从x轴和y轴找到圆的角度,c#,windows,math,uwp,trigonometry,C#,Windows,Math,Uwp,Trigonometry,请随意标记我的问题重复。因为我对COS,SIN,TAN一无所知,其他人可能已经问过这个问题了 所以,我尝试设置基于x轴和y轴的圆形进度条,这可以从gamepad输入中获得。进度条将其简化为最小值为0,最大值为360 我确实试着搜索了一下,但我最好的理解是它只能在180度和正x和y的情况下工作。但是我从控制器得到的输入是,y从-1到1(其中x-1是左,1是右,y-1是底部,1是顶部) 这是到目前为止我的代码 var controller = Windows.Gaming.Input.Gamepad
var controller = Windows.Gaming.Input.Gamepad.Gamepads[0].GetCurrentReading();
x = controller.LeftThumbstickX
y = controller.LeftThumbstickY
//what do I have to do from here?
progress.Value = angle; //?
三角函数是这项工作的工具。在C#中,这是通过以下方式实现的: 将此公式与(例如)参数
(1,1)
一起使用,将得到45的结果
然而,就极性排列而言,这个角度是从“东”逆时针测量的。要将其转换为从“北”顺时针测量的角度,请执行以下操作:
但现在我们可能会遇到负值,因此我们可以使用以下方法对其进行规格化:
double normalizeDegrees(double a) => ((a % 360) + 360) % 360; //convert to 0-360
然后
三角函数是这项工作的工具。在C#中,这是通过以下方式实现的: 将此公式与(例如)参数
(1,1)
一起使用,将得到45的结果
然而,就极性排列而言,这个角度是从“东”逆时针测量的。要将其转换为从“北”顺时针测量的角度,请执行以下操作:
但现在我们可能会遇到负值,因此我们可以使用以下方法对其进行规格化:
double normalizeDegrees(double a) => ((a % 360) + 360) % 360; //convert to 0-360
然后
您需要的方法是
Math.Atan2
。这需要两个参数-首先是y值,然后是x值-它提供以弧度为单位的角度
因为你想要一个以度为单位的角度,你需要转换-转换因子是180/Math.PI
。因此,您将使用以下内容:
var radiansToDegrees = 180 / Math.PI;
progress.Value = Math.Atan2(y,x) * radiansToDegrees;
根据x和y的确切组合需要对应于0,您可能需要在之后添加一定数量的度数。这将为x=1、y=0提供0度,为x=0、y=1提供90度,等等。您需要的方法是
Math.Atan2
。这需要两个参数-首先是y值,然后是x值-它提供以弧度为单位的角度
因为你想要一个以度为单位的角度,你需要转换-转换因子是180/Math.PI
。因此,您将使用以下内容:
var radiansToDegrees = 180 / Math.PI;
progress.Value = Math.Atan2(y,x) * radiansToDegrees;
根据x和y的确切组合需要对应于0,您可能需要在之后添加一定数量的度数。这将为x=1、y=0提供0度,为x=0、y=1提供90度,等等。这是一个非常有洞察力的答案。非常感谢。但我现在已经测试过了,它默认(0,0)为90度。尽管如此,我还是希望它是0。如果(x==0&&y==0)返回0,我是否应该添加
或者公式中有什么可以改变的吗?@ToonWK是的,我认为你必须为0,0
做一个特例,因为数学可能在0处崩溃。@ToonWK顺便说一句,你可以通过使用双compassRadians=Math.atan2(x,y)将参数翻转到atan2
来避免一些数学问题这是一个很有见地的回答。非常感谢。但我现在已经测试过了,它默认(0,0)为90度。尽管如此,我还是希望它是0。如果(x==0&&y==0)返回0,我是否应该添加
或者公式中有什么可以改变的吗?@ToonWK是的,我认为你必须为0,0
做一个特例,因为数学可能在0处崩溃。@ToonWK顺便说一句,你可以通过使用双compassRadians=Math.atan2(x,y)将参数翻转到atan2
来避免一些数学问题代码>
var radiansToDegrees = 180 / Math.PI;
progress.Value = Math.Atan2(y,x) * radiansToDegrees;