2015-04-22 2 views
0

Может ли кто-нибудь помочь мне с этой функцией? Эта функция находится внутри приложения для камеры, которое использует алгоритм фильтрации для обнаружения различий в цветовых вариантах и ​​т. Д. Синтаксис для меня очень сложный. Я не знаю, как обращаться с указателями в аргументах, синтаксисом min и max variable, что такое delta и т. Д.? Может ли кто-нибудь перевести меня? Очень признателен.Перевод функции Obj-C RGBtoHSV() в Swift. min = MIN (r, MIN (g, b)); etc

Также должен ли я что-то делать с 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; 
} 

Swift перевод попытка

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

дельта является значением с плавающей точкой, который принимает значение мин-макс –

+0

Это больше, чем вопрос С это Objective-C один ... –

+0

Вы спрашиваете, как назвать этот метод? –

ответ

4

Свифта эквивалент передает указатель (адрес переменного) является "входным параметром":

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

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

Обратите внимание, что на прошивке вы можете просто использовать 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) 
} 

(или использовать различные способы расширения/удобство от What is the best/shortest way to convert a UIColor to hex (web color) in Swift?)

+0

@Edward: 'RGB -> UIColor -> HSB' был бы хорошей альтернативой, как предложил Леонардо в комментариях. Я не знаю, как быстро это происходит, вам придется протестировать его самостоятельно. Обратите внимание, что HSB совпадает с HSV, а компонент A может быть просто установлен в 1.0. - Я разместил это в основном для решения вашего вопроса о «переменных указателя». –

+0

Хорошо. Я использую последний пример блока Мартина с UIColor, но мне нужно немного изменить расчет. 'rgbMax' и' delta' больше не существует, так как я могу его изменить? Скриншот здесь: i.imgur.com/m5epGpo.png Bbtw. В чем преимущество использования UIColor? – Edward

+0

Привет. Хорошо, поэтому кажется, что мое размещение вызова функции и метода сейчас корректно, но что-то в моем синтаксисе дает мне «не может вызывать« RGBtoHSV »с помощью списка аргументов типа« (Float, Float, Float) »http: // i .imgur.com/sAckG6h.png – Edward