滑块控制的指数算法

时间:2013-10-09 16:30:56

标签: ios objective-c algorithm math

这是一个与Objective-C中的滑块控件相关的问题,但我想这对任何Math数据都是一个问题......

我有2个值:

min = 20; max = 1000;

我还有另一个值:

inc = 10;

当用户滑动滑块控件时,我希望在10个均匀分布的捕捉点上显示最小值和最大值之间的输出值。

每个捕捉点都应输出值:

min + x * inc;

x将增加滑块上的捕捉点越高。

我希望输出在min和max之间逐渐呈指数增长,其中增量会在用户到达滑块顶部附近变大。

例如:20,30,50,100,180,280,420,600,800,1000

实现这一目标所需的数学是什么,并在最小值和最大值之间均匀分布指数级增量?

谢谢!

3 个答案:

答案 0 :(得分:2)

如果我理解正确,你应该记录日志,线性插值并返回指数级别:

i-th point among n = exp(log(min) + (i/n)*(log(max)-log(min)))

答案 1 :(得分:2)

如果你使你的UISlider的valueChange指向这个函数,它就可以了。如果要更改指数值的形状,请将M_E替换为任何浮点数。显示最终指数值

-(IBAction)changeSliderExponentially:(id)sender{

UISlider * slider = (UISlider *)sender;
CGFloat inc = 10.0f;

int discreteValue = round(slider.value * inc);
CGFloat finalValue = discreteValue/inc;
[slider setValue:finalValue];

int min = 20.0f;
int max = 1000.0f;

double exponentialValue = (max - min)*(pow(M_E,finalValue) - pow(M_E,-finalValue))/(pow(M_E,1.0f) - pow(M_E,-1.0f)) + min;
NSLog(@"%f",exponentialValue);

}

答案 2 :(得分:1)

以下是针对Swift 4的@hivert答案,并带有操作示例编号:

let steps = 10
let min: Double = 25
let max: Double = 1000

for i in 0...steps-1 {
  let value = exp(log(min) + (Double(i) / Double(steps-1)) * (log(max) - log(min)))
  print("step: \(i + 1), value: \(round(value))")
}

输出:

step: 1, value: 25.0
step: 2, value: 38.0
step: 3, value: 57.0
step: 4, value: 85.0
step: 5, value: 129.0
step: 6, value: 194.0
step: 7, value: 292.0
step: 8, value: 441.0
step: 9, value: 664.0
step: 10, value: 1000.0