Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Farbwerte zwischen Schwarz und Weiß berechnen? (https://www.delphipraxis.net/126751-farbwerte-zwischen-schwarz-und-weiss-berechnen.html)

PeterPanino 1. Jan 2009 22:53


Farbwerte zwischen Schwarz und Weiß berechnen?
 
Wer könnte mir bei folgendem Problem einen Tipp geben?

Ich habe ein Panel und in der Mitte des Panels ein Objekt. Wenn der Mauszeiger sich am Rande des Panels befindet, ist die Farbe des Panels Schwarz. Je mehr der Mauszeiger sich dem Objekt in der Mitte des Panels nähert, desto heller wird die Farbe des Panels. Wenn der Mauszeiger das Objekt in der Mitte des Panels erreicht, ist die Farbe des Panels Weiß. Dazwischen sollen alle Schattierungen zwischen Schwarz und Weiß (also von Schwarz über Dunkelgrau und Hellgrau bis Weiß) fließend dargestellt werden. Wie könnte man das angehen?

Die Berechnung der Entfernung zum Mittelpunkt des Panels ist nicht schwierig. Wie kann man aber die Reihe der Farbwerte zwischen Schwarz und Weiß berechnen?

SirThornberry 1. Jan 2009 23:01

Re: Farbwerte zwischen Schwarz und Weiß berechnen?
 
Weiß ist der Wert 255 für alle 3 Farbanteile. Schwarz hingegen der Wert 0 für alle 3 Farbanteile.
Den Farbwert kannst du entsprechend mit einer einfachen Verhältnisgleichung berechnen. Ist man ganz am Anfang bei Schwarz ist der Wert 0, ist man genau in der Mitte zwischen Schwarz und weiß wird auch genau der Wert dazwischen genommen (255 / 2)

Namenloser 1. Jan 2009 23:03

Re: Farbwerte zwischen Schwarz und Weiß berechnen?
 
Das ist eigentlich recht einfach. Das Schwierigste ist die Definition des Abstands. Wenn man eifnach den Satz des Pythagoras anwenden würde, wäre es nicht überall am Rand gleich Dunkel. Wie du das definierst überlasse ich daher dir.

Delphi-Quellcode:
function Gray(value: byte): tcolor
begin
  result := rgb(value,value,value);
end;

...

Panel.Color := Gray(distance*255 div max_distance);

blawen 1. Jan 2009 23:08

Re: Farbwerte zwischen Schwarz und Weiß berechnen?
 
Zitat:

Zitat von SirThornberry
Weiß ist der Wert 255 für alle 3 Farbanteile. Schwarz hingegen der Wert 0 für alle 3 Farbanteile.
Den Farbwert kannst du entsprechend mit einer einfachen Verhältnisgleichung berechnen. Ist man ganz am Anfang bei Schwarz ist der Wert 0, ist man genau in der Mitte zwischen Schwarz und weiß wird auch genau der Wert dazwischen genommen (255 / 2)

Wie SirThornberry bereits geschrieben hat. kannst Du die Distanz, bzw. der Farbwert,mathematisch bestimmen. Es gilt einzig zu beachten, dass die zu übergebenden Werte noch gewandelt werden müssen (Dezimal -> Hexadezimal)
Weiss -> $FFFFFF
Schwarz -> $000000

PeterPanino 1. Jan 2009 23:27

Re: Farbwerte zwischen Schwarz und Weiß berechnen?
 
Zitat:

Zitat von NamenLozer
Wenn man eifnach den Satz des Pythagoras anwenden würde, wäre es nicht überall am Rand gleich Dunkel.

Hmm, ja, du hast recht. Sollte man also den Grauwert als Funktion des Abstandes vom Rand des Panels berechnen? Innerhalb eines Rechteckes ist die größte Entfernung eines Punktes von den Rändern genau der Mittelpunkt des Rechteckes.

Ein Punkt P innerhalb eines Rechteckes besitzt 4 Entfernungswerte zu den Rändern des Rechteckes, wenn man diese Entfernungen ausgehend von P als Linien mit einem rechten Winkel zu den Rändern definiert. Dann ist aber die Summe dieser 4 Entfernungswerte in jedem Fall unabhängig von der Position von P immer gleich. Könnte man den Entfernungswert also so festlegen, dass man ihn als Entfernung zur nächstgelegenen Seite des Rechteckes definiert? Würde diese Definition dem entsprechen, was man in der sinnlichen Wahrnehmung als "Nähe zum Rand" (im Umkehrschluss also als Entfernung zur Mitte) definieren würde?

taaktaak 1. Jan 2009 23:34

Re: Farbwerte zwischen Schwarz und Weiß berechnen?
 
Ein Rechteck ist für diese Wahrnehmung (d.h. Berechnung) grundsätzlich ungünstig! Kannst du nicht einen Umkreis verwenden?

PeterPanino 1. Jan 2009 23:47

Re: Farbwerte zwischen Schwarz und Weiß berechnen?
 
Zitat:

Zitat von taaktaak
Ein Rechteck ist für diese Wahrnehmung (d.h. Berechnung) grundsätzlich ungünstig! Kannst du nicht einen Umkreis verwenden?

Wie NamenLozer bereits sagte, wäre das in der Wahrnehmung ungünstig, weil dann der Grauwert an unterschiedlichen Positionen der Ränder unterschiedlich wäre. In der visuellen Wahrnehmung zählt jedoch m.E. auch die Entfernung zum Rand.

Könnte man deshalb bei der Berechnung des Grauwertes eine unterschiedliche Gewichtung vornehmen?: Es wird ein Mittelwert zwischen den beiden Berechnungstypen gebildet; je näher zum Mittelpunkt (nach der pyth. Formel) sich P aber befindet, desto stärker fällt die pyth. Formel ins Gewicht?

taaktaak 2. Jan 2009 00:01

Re: Farbwerte zwischen Schwarz und Weiß berechnen?
 
Ich denke, wir reden aneinander vorbei.
Nur ein Kreis ermöglicht die gewünschte Skalierbarkeit auf ideale Weise. Für ein Quadrat/Rechteck musst du, wie du schon bemerkt hast, eine zusätzliche Gewichtung vornehmen - ob diese aber für den Betrachter (gleichwohl sie mathematisch korrekt sei) intuitiv nachvollziehbar wäre, ist m.E. eine ganz andere Frage.

Namenloser 2. Jan 2009 00:41

Re: Farbwerte zwischen Schwarz und Weiß berechnen?
 
Delphi-Quellcode:
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  value1, value2, value: double;
  c: byte;
  w,h: integer;
begin
  w := panel1.width;
  h := panel1.height;
  // (x-w/2)/w) = x/w - 0.5
  value1 := max(abs(x/w-0.5), abs(y/h-0.5))*2;
  value2 := {1-sqrt(sqr(x-w/2)+sqr(y-h/2))/sqrt(sqr(w/2)+sqr(h/2))}
    abs(x/w-0.5)*abs(y/h-0.5)*2;
  value := {max(value1,value2)}max(max((value1+value2)/2,value1),value2);
  c := round(255-value*255);
  panel1.color := rgb(c,c,c);
end;
Experimentell... relativ gutes Ergebnis (im vergleich zu meinen anderen versuchen). Kannst ja noch etwas dran herumspielen. Wie schon gesagt, eine perfekte Lösung kann es nicht geben.

PeterPanino 2. Jan 2009 01:29

Re: Farbwerte zwischen Schwarz und Weiß berechnen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von NamenLozer
Experimentell... relativ gutes Ergebnis (im vergleich zu meinen anderen versuchen). Kannst ja noch etwas dran herumspielen. Wie schon gesagt, eine perfekte Lösung kann es nicht geben.

WOWWWWWWWWWWW!!! Das funktioniert schon sehr gut! Ich habe das Fenster auf meinem 2560 Pixel breiten Schirm mal ganz breit gemacht, und den Mauspfeil an verschiedenen horizontalen Positionen knapp am oberen Rand gehalten: Dabei blieb das Schwarz immer gleich dunkel. Trotzdem hat man das Gefühl, dass beim Bewegen auf den Mittelpunkt des Panels zu die "Farbbeschleunigung" relativ zur Entfernung des Mittelpunktes natürlich aussieht.

Ich werde den Code morgen früh, wenn ich geistig wieder etwas frischer bin, genauer analysieren.

Inzwischen habe ich mal das fertige Projekt hochgeladen, damit es sich jeder ansehen kann.

Nochmals vielen Dank!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz