我对你们所有人都有一般的编程挑战。我一直在试图弄清楚最好的方法来做到这一点......
我在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 毫秒(最快,接近零)
有任何想法如何以编程方式执行此操作?也许有某种方程?
答案 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.