Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从x轴和y轴找到圆的角度_C#_Windows_Math_Uwp_Trigonometry - Fatal编程技术网

C# 如何从x轴和y轴找到圆的角度

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

请随意标记我的问题重复。因为我对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.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
来避免一些数学问题
或者公式中有什么可以改变的吗?@ToonWK是的,我认为你必须为
0,0
做一个特例,因为数学可能在0处崩溃。@ToonWK顺便说一句,你可以通过使用
双compassRadians=Math.atan2(x,y)将参数翻转到
atan2
来避免一些数学问题
var radiansToDegrees = 180 / Math.PI;
progress.Value = Math.Atan2(y,x) * radiansToDegrees;