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

时间:2013-05-08 06:53:44

标签: c# c#-4.0

我的输入为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的重复序列转换为线性序列,我可以使用正常数字线?因此,如果359达到向上计数2次,则函数告诉我它是720(我可能在这里错过了正确的值1°或2°)而不是359?

3 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分: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;
        }
    }

答案 2 :(得分:0)

int result = input - zero > 180 ? input - zero - 360 : input - zero;