确定角度是否介于 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)
但是好像不行。任何帮助将不胜感激。
让我们换个角度想一想。一、如何定义外角?那里有 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;
}
因此在您的示例中 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;
}
这些是出于演示目的而故意简化的示例。有关优化、浮点精度等的常见注意事项适用。
我已经看到了一些答案,但我对特定于 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;
}
因此在您的示例中 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;
}
这些是出于演示目的而故意简化的示例。有关优化、浮点精度等的常见注意事项适用。