Перевод функции Obj-C RGBtoHSV() на Swift. мин = МИН (r, МИН (g, b)); так далее

Может ли кто-нибудь помочь мне с этой функцией? Эта функция находится внутри приложения камеры, которое использует алгоритм фильтрации для обнаружения различий в цветовых вариантах и ​​т. д. Синтаксис для меня очень сложен. Я не знаю, как обращаться с указателями в аргументах, синтаксисом переменных min и max, что такое дельта и т. д.? Может кто-нибудь, пожалуйста, переведите для меня? Очень признателен.

Также я должен что-то делать с UIColor? Кто-то упомянул об этом ниже. Я понятия не имею, как конвертировать, хотя.

// 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;
}

Быстрая попытка перевода

// 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?
        }
    }

person Edward    schedule 22.04.2015    source источник
comment
delta — это значение с плавающей запятой, которое принимает значение min-max   -  person Teja Nandamuri    schedule 22.04.2015
comment
Это больше вопрос C, чем вопрос Objective-C...   -  person Brian Sachetta    schedule 22.04.2015
comment
вы спрашиваете о том, как вызвать этот метод?   -  person Teja Nandamuri    schedule 22.04.2015
comment
если вы спрашиваете об указателях в аргументах, они нужны в момент вызова метода.   -  person Teja Nandamuri    schedule 22.04.2015
comment
Это для iOS? Почему бы просто не создать UIColor из значений R/G/B, а затем извлечь его компоненты H/S/V?   -  person Martin R    schedule 22.04.2015
comment
я предлагаю вам прочитать документацию Apple: developer.apple. com/library/ios/documentation/Swift/Conceptual/   -  person Teja Nandamuri    schedule 22.04.2015
comment
stackoverflow.com/a/28697136   -  person Leo Dabus    schedule 22.04.2015
comment
Вы можете использовать UIColor (красный, зеленый, синий).hsbComponents. Просто используйте любое альфа-значение, которое вы хотите   -  person Leo Dabus    schedule 23.04.2015
comment
Martin R уже перевел его для вас   -  person Leo Dabus    schedule 23.04.2015


Ответы (1)


Swift-эквивалент передачи указателя (адреса переменной) — это «параметр inout»:

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
}

Это будет называться как

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 есть лучший способ вернуть несколько значений: вы можете вернуть tuple:

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)
}

И это будет называться как

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):

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)
}

(или используйте различные методы расширения/удобства из Какой лучший/кратчайший способ преобразовать UIColor в шестнадцатеричный (веб-цвет) в Swift?)

person Martin R    schedule 22.04.2015
comment
@Edward: RGB -> UIColor -> HSB будет хорошей альтернативой, как мы с Леонардо предложили в комментариях. Я не знаю, насколько это быстро, вы должны будете проверить это сами. Обратите внимание, что HSB — это то же самое, что и HSV, и для компонента A можно просто установить значение 1.0. - Я разместил это в основном для ответа на ваш вопрос о переменных-указателях. - person Martin R; 23.04.2015
comment
Хорошо, я использую последний пример блока Мартина с UIColor, но мне нужно немного изменить расчет. rgbMax и delta больше не существуют, как мне их изменить? Скриншот здесь: i.imgur.com/m5epGpo.png Кстати, в чем преимущество использования UIColor? - person Edward; 23.04.2015
comment
Привет. Итак, теперь кажется, что мое размещение вызова функции и метода правильное, но что-то в моем синтаксисе дает мне cannot invoke 'RGBtoHSV' with an argument list of type '(Float,Float,Float)' i.imgur.com/sAckG6h.png - person Edward; 25.04.2015