将0-1值按指数方式映射到快门速度列表

时间:2016-01-12 23:57:07

标签: ios algebra

我正在尝试使用最小值为0且最大值为1的UISlider来控制相机的曝光,最小快门速度为1/2秒,最大快门速度为1/8192。

以下是用户将看到的快门值列表: [2, 4, 8, 12, 16, 30, 40, 50, 64, 96, 128, 192, 240, 384, 480, 768, 1024, 1536, 2048, 4096, 8192](所有都是一秒钟。)

问题是,这些值无法线性映射。曝光的差异是1/2至1/4,因为它是从1/4096到1/8192。如果它是线性映射的,0.5等于大约4094,所以快门差异的一步将占据滑块的一半。

我希望以指数方式映射值。 0.5应大致等于128,.25应等于16,.75应等于6000。

2 个答案:

答案 0 :(得分:1)

func getShutterValue(sliderValue: Double) -> Int {
    return Int(pow(2,Double(1+Int(sliderValue*12))))
}

print(getShutterValue(0))      // 2
print(getShutterValue(0.25))   // 16
print(getShutterValue(0.4992)) // 64
print(getShutterValue(0.5))    // 128
print(getShutterValue(0.75))   // 1024
print(getShutterValue(1))      // 8192

如下面评论中所述:如果要在连续范围[2.0,8192.0]中返回快门值,可以使用以下修改后的getShutterValue(..)函数:

func getShutterValue(sliderValue: Double) -> Double {
    return pow(2, 1+sliderValue*12)
}

print(getShutterValue(0))      // 2.0
print(getShutterValue(0.25))   // 16.0
print(getShutterValue(0.33))   // 31.12....
print(getShutterValue(0.4992)) // 127.15....
print(getShutterValue(0.5))    // 128.0
print(getShutterValue(0.75))   // 1024.0
print(getShutterValue(1))      // 8192.0

但是请注意,如果您选择使用此方法,请务必注意,如果您计划在某个等同的比较语句(==)中使用快门值,因为浮点数有限精度。

答案 1 :(得分:0)

8192 = 2到13次幂

sliderValue / 13 = power

总计= 2

for i in 1 ... power {     总数* 2 }