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.

