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

本文关键字:高于此 显示 +value -value 一个 零点 设置 如果 | 更新日期: 2023-09-27 18:12:40

我有一个输入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?

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

假设您想要从-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;
    }

我认为这符合您的要求,但我对您的要求没有信心。基本上,给定一个一定大小的"时钟",一个点的相对距离和一个输入值,它将找到到"时钟"上的点的最小距离,要么是负的,要么是正的。

    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;
        }
    }
int result = input - zero > 180 ? input - zero - 360 : input - zero;