我已经看到了一些答案,但我有点不确定 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)
但是好像不行。任何帮助将不胜感激。
最佳答案
让我们换一种方式来思考它。一、外角如何定义?你有 min
和 max
。如果这实际上意味着最小值和最大值,正如变量名称所推断的那样,那就很简单了。如果您的角度介于 -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/