将 0-1 值以指数方式映射到快门速度列表
Map 0-1 values exponentially to a list of shutter speeds
我正在尝试使用最小值为 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/4096 到 1/8192 相同,都是 1/2 到 1/4。如果线性映射,0.5 大约等于 4094,因此快门差异的一步将占据滑块的一半。
我希望以指数方式映射这些值。 0.5 应该大致等于 128,.25 应该等于 16,.75 应该等于 6000。
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
如以下评论所述:如果您想 return 连续跨度 [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
但是请注意,如果您选择使用此方法,请务必注意是否计划在某些等式比较语句 (==
) 中使用快门值,因为浮点数有限精度。
8192 = 2 的 13 次方
sliderValue/13 = 幂
总计 = 2
我在 1...功率 {
总计 * 2
}
我正在尝试使用最小值为 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/4096 到 1/8192 相同,都是 1/2 到 1/4。如果线性映射,0.5 大约等于 4094,因此快门差异的一步将占据滑块的一半。
我希望以指数方式映射这些值。 0.5 应该大致等于 128,.25 应该等于 16,.75 应该等于 6000。
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
如以下评论所述:如果您想 return 连续跨度 [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
但是请注意,如果您选择使用此方法,请务必注意是否计划在某些等式比较语句 (==
) 中使用快门值,因为浮点数有限精度。
8192 = 2 的 13 次方
sliderValue/13 = 幂
总计 = 2
我在 1...功率 { 总计 * 2 }