Avatar billede lanstorp Nybegynder
14. oktober 2002 - 10:38 Der er 7 kommentarer og
1 løsning

Dynamiske farve intevaller fra blå til rød

Jeg skal farvelægge et varierende antal punkter i spektreret fra blå til rød. Dvs. blå -> turkis -> grøn -> gul -> rød, hvis der er 5 punkter. Nogen forslag til en funktion der tildeler et punkt (punktet har en værdi, feks. en højde) en farveværdi mellem blå og rød der passer til punktes værdi. Noget i stil med: Hvis man har 100 punkter, skal man finde 100 farve intervaller mellem rød og blå (det skal være vejen rundt i farvecirkel der kryder grøn, eller kunne man jo nøjes med lilla). Hver punkt får så tildelt en farve afhængig at dens værdi.
Blå: RGB(0,0,255)=255
feks. 98 mellem liggende farver
Rød: RGB(255,0,0)=16711680
Beklager længden af ? :)
Avatar billede dkn Nybegynder
14. oktober 2002 - 11:45 #1
okay denne kode er fra et simpelt gradiant component. Jeg har bare lavet lidt om i den. Du må selv lige finde ud af om du vil lige farven ind i et array eller andet....

Smid en memo, en edit og en button med denne kode, og se om du kan bruge det:

procedure TForm1.Button1Click(Sender: TObject);
var
  diffr, startr, endr: longint;
  diffg, startg, endg: longint;
  diffb, startb, endb: longint;
  rstepr: real;
  rstepg: real;
  rstepb: real;
  i: word;
  TSteps: word;
  TFromColor: TColor;
  TToColor: TColor;
begin
  TSteps := strtoint(edit1.text);
  TFromColor := clblue;
  TToColor := clred;
  memo1.Clear;

  if TSteps = 0 then TSteps := 1;
  startr := (TFromColor and $0000FF);
  startg := (TFromColor and $00FF00) shr 8;
  startb := (TFromColor and $FF0000) shr 16;
  endr := (TToColor and $0000FF);
  endg := (TToColor and $00FF00) shr 8;
  endb := (TToColor and $FF0000) shr 16;

  diffr := endr - startr;
  diffg := endg - startg;
  diffb := endb - startb;

  rstepr := diffr / Tsteps;
  rstepg := diffg / Tsteps;
  rstepb := diffb / Tsteps;

    for i := 0 to Tsteps - 1 do
    begin
      endr := startr + round(rstepr * i);
      endg := startg + round(rstepg * i);
      endb := startb + round(rstepb * i);

      memo1.Lines.Add(Colortostring(endr + (endg shl 8) + (endb shl 16)));
    end;
end;
Avatar billede lanstorp Nybegynder
14. oktober 2002 - 12:57 #2
Der er lidt problemer med koden. Spektraet løber den forkert vej rundt i farvecirklen. Den korteste (blå til rød) vej er over lilla, som koden her gør. Den skal løbe denne anden vej rundt, over grøn og gul til rød. Syntes heller ikke slutfarven er rød, men mere over i lilla. Har prøvet at ændre på diffr,diffg,diffb uden held, for at farverne løber over grøn og gul i stedet for lilla. Kan spektreret løbe den anden vej rundt i farvecirkle. Ellers en rigtig fin kode.
Avatar billede lanstorp Nybegynder
14. oktober 2002 - 13:22 #3
Den med at den sidste farve ikke er helt rød fikses med
for i := 1 to Tsteps do istedet for for i := 0 to Tsteps - 1 do.
Avatar billede lanstorp Nybegynder
14. oktober 2002 - 13:28 #4
Nope, så ryger den blå istedet.
Avatar billede dkn Nybegynder
14. oktober 2002 - 13:41 #5
okay vil lige kigge på det...
Avatar billede dkn Nybegynder
14. oktober 2002 - 15:06 #6
har set lidt på det, men jeg kan ikke lige få den til det ønskede.
Har prøvet en del gradiant componenter for at se, men de bruger alle den samme vej. Målet er at hvis man har en start color på clred og en endcolor på clred, så skal den faktisk lave et farve spectrum.
Avatar billede dkn Nybegynder
14. oktober 2002 - 15:18 #7
mon ikke dette kan bruges:
http://community.borland.com/article/0,1410,16247,00.html
Avatar billede lanstorp Nybegynder
14. oktober 2002 - 16:32 #8
Yep, splitter din første kode op i fire parallelle rutiner som i borlands artikel:
{Red To Yellow} {Yellow To Green} {Green To Cyan} {Cyan To Blue}
Takker for hjælpen :))
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester