1

我有一个 0 到 359 的输入(即指南针)。

我想设置一个零点,如果该值低于或高于此值,则显示为 -value 或 +value。

例子:

Zero Point: 2
Input: 340 => Output: -22
Input: 22 => Output: 20

或者

Zero Point: 40
Input: 30 => Output: -10
Input: 50 => Output: 10

所以无论指南针在哪里,输出总是相对于零点。

PS:甚至更短:如何将 0->359 的重复序列转换为线性序列,我可以像使用普通数轴一样使用它?因此,如果向上计数 2 次达到 359,函数会告诉我它在 720(我可能在这里错过了 1° 或 2° 的正确值)而不是 359?

4

3 回答 3

2

假设您想要从 -179 到 180 的输出,并且零点可以从 0 到 359

int output(int deg, int zeropoint)
    {
        var relative = deg - zeropoint;
        if (relative > 180)
            relative -= 360;
        else if (relative < -179)
            relative += 360;
        return relative;
    }
于 2013-05-08T07:16:47.513 回答
2

我认为这可以满足您的要求,但我对您的要求没有信心。基本上,给定一个特定大小的“时钟”,一个获取相对距离的点和一个输入值,它将找到到“时钟”上的点的最小距离,无论是负的还是正的。

    static void Main(string[] args)
    {
        Console.WriteLine(getRelativeValue(2, 360, 340)); //-22
        Console.WriteLine(getRelativeValue(2, 360, 22));  // 20
        Console.WriteLine(getRelativeValue(2, 360, 178)); // 176
        Console.Read();
    }

    static int getRelativeValue(int point, int upperBound, int value)
    {
        value %= upperBound;
        int lowerBoundPoint = -(upperBound - value + point);
        int upperBoundPoint = (value - point);

        if (Math.Abs(lowerBoundPoint) > Math.Abs(upperBoundPoint))
        {
            return upperBoundPoint;
        }
        else
        {
            return lowerBoundPoint;
        }
    }
于 2013-05-08T07:18:09.923 回答
0
int result = input - zero > 180 ? input - zero - 360 : input - zero;
于 2013-05-08T07:17:52.580 回答