1

这是一个与 Objective-C 中的滑块控件有关的问题,但我想这是任何数学体的问题......

我有 2 个值:

最小值 = 20;最大值 = 1000;

我还有另一个价值:

公司 = 10;

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

每个捕捉点应输出以下值:

最小 + x*inc;

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

我希望输出在 min 和 max 之间逐渐呈指数增长,从而在用户接近滑块顶部时增量变大。

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

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

谢谢!

4

3 回答 3

2

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

i-th point among n = exp(log(min) + (i/n)*(log(max)-log(min)))
于 2013-10-09T16:47:05.763 回答
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);

}

于 2013-10-09T17:03:32.230 回答
1

这是针对 Swift 4 和 OP 示例编号更新的 @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
于 2018-08-02T15:24:37.493 回答