Przechodzenie kolorów (Problem z funkcją)

Odpowiedz Nowy wątek
2011-07-21 00:40
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.

edytowany 1x, ostatnio: sakaszli, 2011-07-21 00:44

Pozostało 580 znaków

2011-07-21 01:30
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


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 4x, ostatnio: unikalna_nazwa, 2011-07-21 16:34
Wprawdzie nie ma to znaczenia dla działania funkcji ale w TColor składniki red i blue są zamienione miejscami (jest BBGGRR a nie RRGGBB). - pelsta 2011-07-21 16:20
hmm, czemu tak? No nie ważne, komentarze poprawione - unikalna_nazwa 2011-07-21 16:34

Pozostało 580 znaków

2011-07-21 02:21
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.

Pozostało 580 znaków

2011-07-21 04:24
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


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 2x, ostatnio: unikalna_nazwa, 2011-07-21 04:31

Pozostało 580 znaków

2011-07-21 06:22
Opi
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;
edytowany 1x, ostatnio: Opi, 2011-07-21 06:29

Pozostało 580 znaków

2011-07-21 13:55
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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