RGB 值在着色时做奇怪的事情? - Swift

RGB Values doing strange things when colorizing? - Swift

func colorBall() {

let colorize1 = SKAction.colorizeWithColor(UIColor.redColor(), colorBlendFactor: 1.0, duration: 0.1)
let colorize2 = SKAction.colorizeWithColor(UIColor.greenColor(), colorBlendFactor: 1.0, duration: 0.1)
let colorize3 = SKAction.colorizeWithColor(UIColor.blueColor(), colorBlendFactor: 1.0, duration: 0.1)

let actions = [colorize1, colorize2, colorize3]
let randomIndex = Int(arc4random_uniform(3))
self.Ball.runAction(actions[randomIndex])


    }
 var colorBucket = [UIColor]()

func randomColor() -> UIColor {

    if colorBucket.isEmpty {
        fillBucket()

    }

    let randomIndex = Int(arc4random_uniform(UInt32(colorBucket.count)))
    let randomColor = colorBucket[randomIndex]
    colorBucket.removeAtIndex(randomIndex)
    return randomColor

}
  func fillBucket() {
    colorBucket = [UIColor.redColor(), UIColor.greenColor(), UIColor.blueColor()]
}

当我在我的游戏中 运行 这段代码,并打印出我的球的颜色值时,它有时会打印出这样的数字:

 UIDeviceRGBColorSpace 1 2.98023e-08 2.98023e-08 1

为什么要这样做?我只想说:UIDeviceRGBColorSpace 0 0 1 1 如果它是蓝色,IDeviceRGBColorSpace 1 0 0 1 如果它是红色,等等

如何防止这些数字高于一或远低于一?是什么让他们在我的代码中这样做?

2.98023e-08 是 0.0000000298023。如果您在 Google 或其他搜索引擎上查找值 2.98023e-08,您会发现几个由于舍入误差而获得该值的示例。由于 how computers treat floating-point numbers.

出现舍入错误

这可能是 colorizeWithColor 使用的插值代码的舍入误差,您得到的不是零。出于实际目的,当谈到要向最终用户显示的颜色分量时,我会说任何小于 1/256 的值都可以被认为是零。

您可以像这样测试两个浮点数是否 "about equal"(在我的 phone 上输入,不能保证有效):

func areAboutTheSame(a: Double, b: Double) -> Bool {
    let difference = a-b
    return difference < 1/256 && difference > -1/256
}

部分基于 zneak 的回答,我已经对 UIColor 进行了这个(没有刺激或多余的装饰)扩展,它可能会派上用场:

extension UIColor {
    func isVisuallyEqual(color: UIColor) -> Bool {
        let compareValues = CGColorGetComponents(color.CGColor)
        let values = CGColorGetComponents(self.CGColor)

        let count = CGColorGetNumberOfComponents(self.CGColor)
        if count != CGColorGetNumberOfComponents(color.CGColor) {
            debugPrint("color-parameter has mismatching colorSpace")
            return false
        }
        for index in 0..<count {
            if !fuzzyFloatCompares(values[index], float2: compareValues[index]) {
                return false
            }
        }
        return true
    }

    private func fuzzyFloatCompares(float1: CGFloat, float2: CGFloat) -> Bool {
        let difference = float1 - float2
        return difference >= -1/256 && difference <= 1/256
    }
}