Nadesłany przez Tomasz Lubiński, 06 września 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
hsv_rgb_d/hsv_rgb.dpr:
// Transformacja pomiedzy modelami HSV i RGB // www.algorytm.org // (c)2005 Tomasz Lubinski program hsv_rgb; {$APPTYPE CONSOLE} uses SysUtils, Math; type results = Array [1..3] of double; function fmod(x: double; y: double): double; begin Result := x - Int(x / y) * y; end; function hsv2rgb(hue: double; sat: double; val: double): results; var red, grn, blu :double; i, f, p, q, t: double; rgb: results; begin red := 0; grn := 0; blu := 0; if val=0 then begin red := 0; grn := 0; blu := 0; end else begin hue := hue/60; i := floor(hue); f := hue-i; p := val*(1-sat); q := val*(1-(sat*f)); t := val*(1-(sat*(1-f))); if i=0 then begin red:=val; grn:=t; blu:=p; end else if i=1 then begin red:=q; grn:=val; blu:=p; end else if i=2 then begin red:=p; grn:=val; blu:=t; end else if i=3 then begin red:=p; grn:=q; blu:=val; end else if i=4 then begin red:=t; grn:=p; blu:=val; end else if i=5 then begin red:=val; grn:=p; blu:=q; end; end; rgb[1] := red; rgb[2] := grn; rgb[3] := blu; result := rgb; end; function rgb2hsv(red: double;grn: double; blu:double): results; var hue, sat, val: double; x, f, i: double; hsv: results; begin x := MIN(MIN(red, grn), blu); val := MAX(MAX(red, grn), blu); if x = val then begin hue := 0; sat := 0; end else begin if red = x then f := grn-blu else if grn = x then f := blu-red else f := red-grn; if red = x then i := 3 else if grn = x then i := 5 else i := 1; hue := fmod((i-f/(val-x))*60, 360); sat := ((val-x)/val); end; hsv[1] := hue; hsv[2] := sat; hsv[3] := val; result := hsv; end; var x: Integer; h,s,v: double; r,g,b: double; res: results; begin writeln('1. Dla transformacji HSV -> RGB'); writeln('2. Dla transformacji RGB -> HSV'); readln(x); if x = 1 then begin write('H='); readln(h); write('S='); readln(s); write('V='); readln(v); res := hsv2rgb(h,s,v); write('R='+FloatToStr(res[1])+ ', G='+FloatToStr(res[2])+ ', B='+FloatToStr(res[3])); end else begin write('R='); readln(r); write('G='); readln(g); write('B='); readln(b); res := rgb2hsv(r,g,b); write('H='+FloatToStr(res[1])+ ', S='+FloatToStr(res[2])+ ', V='+FloatToStr(res[3])); end; readln; end.