我正在尝试使用最小值为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。
答案 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 }