Przechodzenie kolorów (Problem z funkcją)

0

Witam

Mam dziwny problem z funkcją która ma obliczyć kolor po podaniu "progresu".
Wygląda ona tak:

 
function HexToTColor(sColor : string) : TColor;
begin
   Result :=
     RGB(
       StrToInt('$'+Copy(sColor, 1, 2)),
       StrToInt('$'+Copy(sColor, 3, 2)),
       StrToInt('$'+Copy(sColor, 5, 2))
     ) ;
end;


function Przejscie(A,B:TColor; pos,max_pos:integer):Tcolor;
var
C:TColor;
a1,b1,c1:integer;
begin
a1:=Trunc(abs(((GetRValue(b) - GetRValue(a))*pos)/max_pos + GetRValue(a)));
b1:=Trunc(abs(((GetGValue(b) - GetGValue(a))*pos)/max_pos + GetGValue(a)));
c1:=Trunc(abs(((GetBValue(b) - GetBValue(a))*pos)/max_pos + GetBValue(a)));
C:= HexToTColor((IntToHex(a1,2)) + (IntToHex(b1,2)) + IntToHex(c1,2));
result:= C;
end;

Problem w tym że nie wiem dlaczego czasem funkcja "wybucha" i np. podaje na zmianę kolor1 i kolor2, lub inne cuda O_o
Z góry dziękuję za pomoc.

0

wariuje przy tych samych parametrach? Jak nie to może do "max_pos" podajesz na przykład 0

poza tym używanie stringów do czegokolwiek poza prezentacją wyników userowi wydaje mi się złe
nie pamiętam już delphi ale wydaje mi się, że TColor to po prostu nakładka nazwowa na Integer, więc powinno zadziałać:

function przejscie(A, B: TColor; pos, max_pos: Integer): TColor;
var coeff: double;
begin
    coeff := pos / max_pos;
    Result :=
        round((A and $ff000000) * coeff + (B and $ff000000) * (1 - coeff)) and $ff000000 or // alpha (można usunąć)
        round((A and $00ff0000) * coeff + (B and $00ff0000) * (1 - coeff)) and $00ff0000 or // blue
        round((A and $0000ff00) * coeff + (B and $0000ff00) * (1 - coeff)) and $0000ff00 or // green
        round((A and $000000ff) * coeff + (B and $000000ff) * (1 - coeff)) and $000000ff; // red
end;

ewentualnie dodając tutaj rzutowanie
a w ogóle to powinna istnieć już do tego gotowa funkcja

0

Gdzieś się machnąłeś ponieważ funkcja nie do końca działa jak powinna. Najlepiej sam zobacz(old=moja,new=twoja):

http://www.aedes.us/i8/B9fA5.jpg

Co do mojej funkcji, problem występuje randomowo po podaniu koloru (jest on w 100% poprawny, sprawdza to inna funckja(długość,znaki w nim zawarte)), po podaniu identycznych parametrów funkcja działa prawidłowo. Po prostu w "sprzyjających warunkach" funkcja jakimś cudem się wywala. progres i max tez są poprawne, nawet gdy progres=0 funkcja działa normalnie.

0

aha, no faktycznie tam przed każdym or powinno być and $xxxxxxxx (odpowiednia maska)
już poprawione (nie mam jak sprawdzić)

podaj jakieś dane przy których nie działa Twoja to łatwiej będzie się domyśleć gdzie szukać błędu

0

http://rmklever.com/?p=116

// Mix two colors (value in percent)
//Author      : Roy Magne Klever ([email protected])
function Blend(const Color1, Color2: TColor; Value: Byte): TColor;
var
 i: LongInt;
 r1, g1, b1, r2, g2, b2: Byte;
begin
 Value := Round(2.56 * Value);
 i  := ColorToRGB(Color2);
 R1 := Byte(i);
 G1 := Byte(i shr 8);
 B1 := Byte(i shr 16);
 i  := ColorToRGB(Color1);
 R2 := Byte(i);
 G2 := Byte(i shr 8);
 B2 := Byte(i shr 16);
 R1 := (Value * (R2 - R1)) shr 8 + R1;
 G1 := (Value * (G2 - G1)) shr 8 + G1;
 B1 := (Value * (B2 - B1)) shr 8 + B1;
 Result := (B1 shl 16) + (G1 shl 8) + R1;
end;
0

Funkcja użytkownika: unikalna_nazwa , działa jak na razie najszybciej i bez błędów. Szukanie błędnych danych podobne jest do szukanie igły w stogu siana. Jeśli się znowu napotkam na ten problem zapisze dane i "odgrzeje" temat.

Dziękuje wszystkim za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1