algorytm.org

Implementacja w Delphi/Pascal



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Transformacja HSV RGB - Implementacja w Delphi/Pascal
Ocena użytkownikóww: *****  / 2
SłabyŚwietny
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.
Dodaj komentarz