C - 返回曲线结果的函数

时间:2013-10-18 15:56:33

标签: c math equation-solving

我对你们所有人都有一般的编程挑战。我一直在试图弄清楚最好的方法来做到这一点......

我在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 毫秒(最快,接近零)

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

2 个答案:

答案 0 :(得分:3)

通常在数学中你可以做类似的事情:

(currentSpeed / 255) * 3000

表示线性,并获得一点曲线使用幂:

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

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

要做到这一点,没有浮动点,你必须在分裂前先放大。

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

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