如何缩放数字以适应指定范围?例如,如果我有:
Input_min = 10.1;
Input_max = 750.0;
Range_min = 0.0;
Range_max = 350.0;
example Input_n = 503.9;
Run Code Online (Sandbox Code Playgroud)
如何使用swift在最小和最大范围内缩放任何数字?
编辑/更新: Xcode 11.5 • Swift 5.2
extension FloatingPoint {
func converting(from input: ClosedRange<Self>, to output: ClosedRange<Self>) -> Self {
let x = (output.upperBound - output.lowerBound) * (self - input.lowerBound)
let y = (input.upperBound - input.lowerBound)
return x / y + output.lowerBound
}
}
Run Code Online (Sandbox Code Playgroud)
extension BinaryInteger {
func converting(from input: ClosedRange<Self>, to output: ClosedRange<Self>) -> Self {
let x = (output.upperBound - output.lowerBound) * (self - input.lowerBound)
let y = (input.upperBound - input.lowerBound)
return x / y + output.lowerBound
}
}
Run Code Online (Sandbox Code Playgroud)
let integer = 380
let result = integer.converting(from: 10...750, to: 100...350) // 225
let double = 750.0
let result = double.converting(from: 10.1...750.0, to: 0...350) // 350
Run Code Online (Sandbox Code Playgroud)
这是 Swift 3 兼容版本,它也支持泛型(不只为 Doubles 绑定 Rescale)。
struct Rescale<Type : BinaryFloatingPoint> {
typealias RescaleDomain = (lowerBound: Type, upperBound: Type)
var fromDomain: RescaleDomain
var toDomain: RescaleDomain
init(from: RescaleDomain, to: RescaleDomain) {
self.fromDomain = from
self.toDomain = to
}
func interpolate(_ x: Type ) -> Type {
return self.toDomain.lowerBound * (1 - x) + self.toDomain.upperBound * x;
}
func uninterpolate(_ x: Type) -> Type {
let b = (self.fromDomain.upperBound - self.fromDomain.lowerBound) != 0 ? self.fromDomain.upperBound - self.fromDomain.lowerBound : 1 / self.fromDomain.upperBound;
return (x - self.fromDomain.lowerBound) / b
}
func rescale(_ x: Type ) -> Type {
return interpolate( uninterpolate(x) )
}
}
Run Code Online (Sandbox Code Playgroud)
示例是:
Rescale(from: (15, 85), to: (0, 100)).rescale(85)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3157 次 |
| 最近记录: |