这是一个与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
实现这一目标所需的数学是什么,并在最小值和最大值之间均匀分布指数级增量?
谢谢!
答案 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