首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Obj()函数转换为Swift。min = MIN( r,MIN(g,b ));等

将Obj()函数转换为Swift。min = MIN( r,MIN(g,b ));等
EN

Stack Overflow用户
提问于 2015-04-22 20:02:41
回答 1查看 851关注 0票数 0

有谁能帮我做这件事吗?这个功能是在一个相机应用程序中,它使用过滤算法来检测颜色变化等方面的差异。语法对我来说非常困难。我不知道如何处理参数中的指针、min和max变量语法、什么是增量等等?有人能帮我翻译一下吗?非常感谢。

我还应该用UIColor做点什么吗?下面有人提过了。不过,我不知道该如何转换。

代码语言:javascript
运行
复制
// r,g,b values are from 0 to 1 // h = [0,360], s = [0,1], v = [0,1]
//  if s == 0, then h = -1 (undefined)

void RGBtoHSV( float r, float g, float b, float *h, float *s, float *v ) {
float min, max, delta;
min = MIN( r, MIN(g, b ));
max = MAX( r, MAX(g, b ));
*v = max;
delta = max - min;
if( max != 0 )
    *s = delta / max;
else {
    // r = g = b = 0
    *s = 0;
    *h = -1;
    return;
}
if( r == max )
    *h = ( g - b ) / delta;
else if( g == max )
    *h=2+(b-r)/delta;
else
    *h=4+(r-g)/delta;
*h *= 60;
if( *h < 0 )
    *h += 360;
}

快速翻译尝试

代码语言:javascript
运行
复制
// r,g,b values are from 0 to 1 // h = [0,360], s = [0,1], v = [0,1]
    //  if s == 0, then h = -1 (undefined)

    func RGBtoHSV(r:Float, g:Float, b:Float, h:Float, s:Float, v:Float) {
        var min:Float = 0.0
        var max:Float = 0.0
        var delta:Float = 0.0

        min = MIN(r, MIN(g, b))
        max = MAX(r, MAX(g, b))

        var v = max
        delta = max - min

        if max != 0 {
           var s = delta / max
        }
        else{
            // r = g = b = 0
            var s = 0
            var h = -1
            return
        }

        if r == max {
            var h = (g - b) / delta
        }
        else if (g == max) {
            var h = 2 + (b - r ) / delta
        }
        else{
            var h = 4 + (r - g) / delta
            var h = 60
        }
        if (h < 0) {
            var h += 360    // how to deal with all of these pointers here in the original Obj-C function above?
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-22 21:10:30

传递指针(变量地址)的Swift等效值是"inout参数“:

代码语言:javascript
运行
复制
func RGBtoHSV(r : Float, g : Float, b : Float, inout h : Float, inout s : Float, inout v : Float) {
    let rgbMin = min(r, g, b)
    let rgbMax = max(r, g, b)
    let delta = rgbMax - rgbMin

    v = rgbMax
    s = delta/rgbMax
    h = Float(0.0) // Replace by your actual calculation
}

这将被称为

代码语言:javascript
运行
复制
let r : Float = 0.3
let g : Float = 0.5
let b : Float = 0.7

var h : Float = 0.0
var s : Float = 0.0
var v : Float = 0.0

RGBtoHSV(r, g, b, &h, &s, &v)
println([h, s, v])

但是在Swift中有一种更好的方法来返回多个值:您可以返回一个元组

代码语言:javascript
运行
复制
func RGBtoHSV(r : Float, g : Float, b : Float) -> (h : Float, s : Float, v : Float) {
    let rgbMin = min(r, g, b)
    let rgbMax = max(r, g, b)
    let delta = rgbMax - rgbMin

    let v = rgbMax
    let s = delta/rgbMax
    let h = Float(0.0)  // Replace by your actual calculation

    return (h, s, v)
}

这将被称为

代码语言:javascript
运行
复制
let r : Float = 0.3
let g : Float = 0.5
let b : Float = 0.7
let (h, s, v) = RGBtoHSV(r, g, b)
println([h, s, v])

注意,在iOS上,您可以简单地使用UIColor类在RGB和HSV (== HSB)之间进行转换:

代码语言:javascript
运行
复制
func RGBtoHSV(r : CGFloat, g : CGFloat, b : CGFloat) -> (h : CGFloat, s : CGFloat, v : CGFloat) {
    var h : CGFloat = 0.0
    var s : CGFloat = 0.0
    var v : CGFloat = 0.0
    let col = UIColor(red: r, green: g, blue: b, alpha: 1.0)
    col.getHue(&h, saturation: &s, brightness: &v, alpha: nil)
    return (h, s, v)
}

(或使用来自What is the best/shortest way to convert a UIColor to hex (web color) in Swift?的各种扩展/方便方法)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29807686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档