Ios 滑块控制的指数算法

Ios 滑块控制的指数算法,ios,objective-c,algorithm,math,Ios,Objective C,Algorithm,Math,这是一个与Objective-C中的滑块控制有关的问题,但我想这是一个适合任何数学专家的问题 我有两个价值观: 最小值=20; 最大值=1000 我还有另一个价值观: inc=10 当用户滑动滑块控件时,我希望在10个均匀分布的捕捉点上显示最小值和最大值之间的输出值 每个捕捉点应输出以下值: min+x*inc 滑块上的捕捉点越高,x值就越大 我希望输出在最小值和最大值之间以指数形式逐渐增加,用户到达滑块顶部时,增量越大 例如:20、30、50、100、180、280、420、600、800、1

这是一个与Objective-C中的滑块控制有关的问题,但我想这是一个适合任何数学专家的问题

我有两个价值观:

最小值=20; 最大值=1000

我还有另一个价值观:

inc=10

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

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

min+x*inc

滑块上的捕捉点越高,x值就越大

我希望输出在最小值和最大值之间以指数形式逐渐增加,用户到达滑块顶部时,增量越大

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

要实现这一点,并在最小值和最大值之间均匀地分配指数递增的增量,所需的数学是什么


谢谢

如果我理解正确,你应该取对数,线性插值,然后回到指数比例:

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

如果我理解正确,你应该取对数,线性插值,然后回到指数比例:

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

如果您使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);

}

如果您将UI滑块的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);

}

以下是@hivert针对Swift 4更新的答案,其中包含了OPs示例编号:

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

以下是@hivert为Swift 4更新的答案,并带有OPs示例编号:

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