请随时将我的问题标记为重复。因为我对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; //?
答案 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度,等等。