c# - 确定角度是否在 2 个其他角度之间

标签 c# math xna trigonometry

我已经看到了一些答案,但我有点不确定 C#/XNA 特定的实现。

我有以下内容:

var targetAngle = 0.2f;
var min = 0.8f;
var max = -0.98f;

现在,我只是在使用

targetAngle > min || targetAngle < max

但据我了解,因为 XNA 中的角度位于 PI 和 -PI 之间,并且环绕,所以这是行不通的。我也在这里尝试了这个问题的声明 Is angle in between two angles

if ((max - min) % Math.PI > 0 && targetAngle > max && targetAngle < min)

但是好像不行。任何帮助将不胜感激。

最佳答案

让我们换一种方式来思考它。一、外角如何定义?你有 minmax 。如果这实际上意味着最小值和最大值,正如变量名称所推断的那样,那就很简单了。如果您的角度介于 -Pi+Pi 之间,只需首先将 2*Pi 添加到小于 0 的任何值来标准化这些值,然后检查如果 targetAngle 位于两者之间,就像您已经完成的那样。例如:

 public bool IsBetween(float min, float max, float targetAngle)
 {
     var normalisedMin = min > 0 ? min : 2 * Math.PI + min;
     var normalisedMax = max > 0 ? max : 2 * Math.PI + max;
     var normalisedTarget = targetAngle > 0 ? targetAngle : 2 * Math.PI + targetAngle;

     return normalisedMin <= normalisedTarget && normalisedTarget <= normalisedMax;
 }

因此,在您的示例中,normalizedMax 大致等于 -0.98 + (3.14 * 2) = 5.30,因此目标角度不在两者之间。

或者,您可以假设您打算在两个外角之间取尽可能小的距离,在这种情况下,max 实际上可能比 min 更低,并且对于测试仍然有效。在这种情况下,您只需查看从目标角度到其他任一角度的距离是否大于 90 度。如果是,则目标位于定义的角度之外。如果两者都小于(或等于,取决于您如何定义边缘情况)90 度,则目标角度在内部。例如:

public bool IsBetween(float a, float b, float targetAngle)
{
    const float maxDistance = (float)Math.PI * 0.5f; // 90 degrees

    return Math.Abs(MathHelper.WrapAngle(a - targetAngle)) < maxDistance
        && Math.Abs(MathHelper.WrapAngle(b - targetAngle)) < maxDistance;
}

这些是出于演示目的而特意简化的示例。有关优化、 float 精度等的常见警告适用。

关于c# - 确定角度是否在 2 个其他角度之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31647023/

相关文章:

c# - n 个列表的字符串的组合

bash - 在 bash 中提高到非整数指数?

language-agnostic - 如何使用线性插值法估算两个地理坐标之间的当前位置?

c# - cocos2d-xna : sprite is not drawn if using instance of a class inherited from sprite

c# - XNA 4.0 寻找房间算法问题

c# - 结果与空 LINQ 查询的联合

c# - 为什么自定义 html 助手无法正确呈现标签

Java 数学解析 API

c# - 使用 PNG 作为带碰撞检测的背景图

c# - Open AI 的 GPT Davinci - 问它问题,但它返回乱码?