我正在寻找一个给定start angle, end angle, moving clockwise or anticlockwise, hitting angle
的函数,并且如果此类移动遇到hitting angle
,则会返回。
因此,例如,如果我们以顺时针方向从270度移动到50度,它将会达到hitting angle = 0 or 360
度位置,但如果我们沿逆时针方向移动它将不会被击中。
另一个例子是,如果我们顺时针从80度移动到100度,它将会hitting angle = 90
但不是逆时针方向。
答案 0 :(得分:1)
首先,您并不需要明确传递旅行方向。您只需要一种方法来指定特定的角度弧。所以你可以采用角度应该从开始到结束角度移动时增加的约定。要指定弧的倒数,只需以相反的顺序传递开始和结束。
所以,让我们定义一个函数,如果角度在0到360度之间,则可以工作 - 不需要模数:
bool IsBetween(int low, int high, int target)
{
return (target >= low && target <= high);
}
仅当low
不大于high
时才有效。如果是(因为角度扫过360度线),那么我们可以将弧分成两个部分,一个从起始角度到360度,一个从0到终止角度。
bool SweepHits(int start, int finish, int target)
{
// check for the simple case
if (start <= finish) return IsBetween(start, finish, target);
// straddling 360 degrees - break into two sections
return IsBetween(start, 360, target) || IsBetween(0, finish, target);
}
答案 1 :(得分:0)
作为旁注,我认为你最初的例子可能是错的?如果我们从270度开始并顺时针方向前进到50度,我们将不会达到0度(如果顺时针从80度移动到100度,则相同,你不会达到90度。这个答案假定你的错误。
为了澄清,这个答案的角度从0度开始,逆时针旋转到360度。
更新: 无论起始角度是小于还是大于结束角度,现在都可以使用。
public static bool DidWeHitAngle(double hittingAngle, double startAngle, double endAngle, bool clockwise)
{
var minAngle = Math.Min(startAngle, endAngle);
var maxAngle = Math.Max(startAngle, endAngle);
var dir = minAngle == startAngle ? clockwise : !clockwise;
if (hittingAngle < minAngle || hittingAngle > maxAngle)
{
if (dir)
return true;
}
else
{
if (!dir)
return true;
}
return false;
}