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