【问题标题】:How can I find a circle angle from x and y axis如何从 x 和 y 轴找到圆角
【发布时间】:2018-11-21 14:09:42
【问题描述】:

请随意将我的问题标记为重复。因为我对 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; //?

【问题讨论】:

    标签: c# windows math uwp trigonometry


    【解决方案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);
    

    【讨论】:

    • 嗯,这是非常有见地的答案。谢谢你。但我现在对此进行了测试,默认 (0,0) 为 90 度。尽管如此,我希望它为 0。我应该添加 if (x == 0 && y == 0) return 0; 还是该公式中的某些内容可以更改?
    • @ToonWK 是的,我认为你必须为0,0 做一个特殊情况,因为数学可能会在 0 处分解。
    • @ToonWK 顺便说一句,您可以通过将参数翻转到 atan2double compassRadians = Math.Atan2(x,y); 来避免这里的一些数学运算
    【解决方案2】:

    你想要的方法是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 和 90 度,x = 1、y = 1 等为 0 度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多