如何从x和y轴找到圆角

时间:2018-11-21 14:09:43

标签: c# windows math uwp trigonometry

请随时将我的问题标记为重复。因为我对COS,SIN和TAN完全一无所知,其他人可能已经问过这个问题。

因此,我试图根据可以从游戏手柄输入获得的x和y轴设置圆形进度条。简单地说,进度条仅为最小值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; //?

2 个答案:

答案 0 :(得分:1)

三角函数atan2是用于此作业的工具。在C#中,这是由Math.Atan2实现的:

double angleInRadians = Math.Atan2(y, x);
double angleInDegrees = (180 / Math.PI) * angleInRadians;

将此公式与(例如)参数(1,1)一起使用,结果为45。

但是,就极坐标而言,此角度是从“东”开始逆时针测量的。要将其转换为从“北”沿顺时针方向测量的角度:

double compassRadians = Math.PI / 2 - angleInRadians;
double compassDegrees = (180 / Math.PI) * compassRadians;

但是现在我们可能会遇到负值,因此我们可以使用以下方法对其进行标准化:

double normalizeDegrees(double a) => ((a % 360) + 360) % 360; //convert to 0-360

然后

var compassAngle = normalizeDegrees(compassDegrees);

答案 1 :(得分:1)

您想要的方法是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度,等等。