funkcije min i max su iz unita Math i sluze zans cemu(odredjivanju minimuma i maximuma 2 broja)
Imao si gresku u deklaraciji funkcije Pastelan(r,g,b) trebalo je da stavis da su r,g,b tipa byte(posto sam primer pisao samo kao skicu).
Ono v je trebalo da bude Val
E sad nesto drugo: Ja sam ti dao kao primer da se skeniraju sve boje od 0..255 za r,g,b a to je preko 16 miliona skeniranja. Bice jako puno boja u onom tvom listboxu (nekoliko milona), zaro treba da odredis korak za nje. Ukinuo sam for petlje, a ti biraj korak.
I sa korakom od 32, je broj boja dosta veliki.
Code:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, math;
type
THSV = record // hue saturation value (HSV)
Hue , Sat , Val : Double;
end;
type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function RGB2HSV (R,G,B : Byte) : THSV;
var
Min_, Max_, Delta : Double;
H , S , V : Double ;
begin
H := 0.0 ;
Min_ := Min (Min( R,G ), B);
Max_ := Max (Max( R,G ), B);
Delta := ( Max_ - Min_ );
V := Max_ ;
If ( Max_ <> 0.0 ) then
S := 255.0 * Delta / Max_
else
S := 0.0 ;
If (S <> 0.0) then
begin
If R = Max_ then
H := (G - B) / Delta
else
If G = Max_ then
H := 2.0 + (B - R) / Delta
else
If B = Max_ then
H := 4.0 + (R - G) / Delta
End
else
H := -1.0 ;
H := H * 60 ;
If H < 0.0 then H := H + 360.0;
with Result Do
begin
Hue := H ; // Hue -> 0..360
Sat := S * 100 / 255; // Saturation -> 0..100 %
Val := V * 100 / 255; // Value - > 0..100 %
end;
end;
//odredjivanje pastelne (potreban gornji kod)
function Pastelna(r,g,b:byte): boolean;
var
t:THSV;
begin
t:=RGB2HSV(r,g,b);
result := t.val>=70
end;
procedure TForm1.Button1Click(Sender: TObject);
const
korak=32;
var
r,g,b:integer;
begin
r:= 0;
while r < 256 do
begin
g := 0;
while g < 256 do
begin
b:= 0;
while b<256 do
begin
if pastelna(r,g,b) then
listbox1.Items.Add(colortostring(rgb(r,g,b)));
inc(b,korak);
end;
inc(g, korak);
end;
inc(r,korak);
end;
end;
end.