1

我有一个通用的编程挑战给你们。我一直在挠头,试图找出最好的方法来做到这一点......

我在 C 语言中工作,我有一个“速度”值传递给我的程序。范围为 0-255。这个速度值需要对应于程序中内置的毫秒时间延迟。

    unsigned char currentSpeed; //this is passed into my function, range 0-255
    unsigned long SlowestSpeedMillis = 3000; //in milliseconds
    if (currentSpeed > 0)
    {
       unsigned long Interval = ((256 - currentSpeed)*SlowestSpeedMillis)/255;

    }else{ //currentSpeed = 0
       //When Interval is zero, the program will freeze
       Interval = 0;
    }

以下是一些示例结果:
currentSpeed 为1导致3000毫秒(最慢)
currentSpeed 为128导致~1500毫秒(正好是一半)
currentSpeed 为255导致~11毫秒(最快)

问题是我希望它是一个弯曲的结果,它保持在较低的数字中,然后在最后快速达到 3000 ......我希望用户可以选择让程序慢到 3000,但导致它的大多数价值观并不那么重要。例如:
currentSpeed 为1导致3000毫秒(最慢)
currentSpeed 为128导致~750毫秒(潜在的 1/4)
currentSpeed 为255导致~11毫秒(最快,接近于零的任何值)

任何想法如何以编程方式执行此操作?也许有某种方程式?

4

2 回答 2

3

通常在数学中,您可能会执行以下操作:

(currentSpeed / 255) * 3000

对于线性,要获得一点曲线,请使用幂:

((currentSpeed / 255) * (currentSpeed / 255)) * 3000

但是,在整数数学中不起作用,因为 (currentSpeed / 255) 几乎总是为零。

要在没有浮点的情况下执行此操作,您必须在除法之前先按比例放大。

((3000 * currentSpeed) * currentSpeed) / (255 * 255)
于 2013-10-18T16:07:46.310 回答
0

您可以使用

unsigned char currentSpeed; // range 0-255
unsigned long SlowestSpeedMillis = 3000; // in milliseconds
unsigned long Interval;
if (currentSpeed > 0)
{
   Interval = SlowestSpeedMillis/currentSpeed;

} else {
   Interval = 0;
}

1 映射到 3000,255 映射到 11。

于 2013-10-18T16:28:49.767 回答