确定角度是否介于 2 个其他角度之间

Determine if Angle is Between 2 Other Angles

我已经看到了一些答案,但我对特定于 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;
 }

因此在您的示例中 normalisedMax 大致等于 -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;
}

这些是出于演示目的而故意简化的示例。有关优化、浮点精度等的常见注意事项适用。