Nadesłany przez Nikodem Solarz, 19 lutego 2013 12:28
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
hsv_rgb.rb:
#======================================================
#**Implementacja algorytmu przekształcania modeli barw
#**RGB->HSV i na odwrót (HSV->RGB)
#**Narzew
#**19.02.2013
#**www.algorytm.org
#======================================================
#======================================================
#**Metody pomocnicze
#======================================================
def wartosc_max(x)
result = x[0]
x.each{|y|
result = y if y > result
}
return result
end
def wartosc_min(x)
result = x[0]
x.each{|y|
result = y if y < result
}
return result
end
#======================================================
#**Metody właściwe
#======================================================
#======================================================
#**rgb->hsv
#======================================================
def rgb2hsv(r,g,b)
r = r.to_f
g = g.to_f
b = b.to_f
x = wartosc_min([wartosc_min([r,g]),b])
v = wartosc_max([wartosc_max([r,g]),b])
if x == v
h = 0
s = 0
return [h,s,v]
else
if r == x
f = g-b
else
if g == x
f = b-r
else
f = r-g
end
end
if r == x
i = 3
else
if g == x
i = 5
else
i = 1
end
end
h = ((i-f/(v-x))*60)%360
s = ((v-x)/v)
return [h,s,v]
end
end
#======================================================
#**hsv->rgb
#======================================================
def hsv2rgb(h,s,v)
h = h.to_f
s = s.to_f
v = v.to_f
if v == 0
r = 0
g = 0
b = 0
return [r,g,b]
else
h = h/60
i = h.floor
f = h-i
p = v*(1-s)
q = v*(1-(s*f))
t = v*(1-(s*(1-f)))
if i == 0
r=v
g=t
b=p
elsif i == 1
r=q
g=v
b=p
elsif i == 2
r=p
g=v
b=t
elsif i == 3
r=p
g=q
b=v
elsif i == 4
r=t
g=p
b=v
elsif i == 5
r=v
g=p
b=q
end
return [r,g,b]
end
end

