用于测试位置是否在给定方向的圆上命中的通用函数

时间:2016-08-22 03:16:53

标签: geometry

我正在寻找一个给定start angle, end angle, moving clockwise or anticlockwise, hitting angle的函数,并且如果此类移动遇到hitting angle,则会返回。

因此,例如,如果我们以顺时针方向从270度移动到50度,它将会达到hitting angle = 0 or 360度位置,但如果我们沿逆时针方向移动它将不会被击中。

另一个例子是,如果我们顺时针从80度移动到100度,它将会hitting angle = 90但不是逆时针方向。

2 个答案:

答案 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;
    }