Nach der stärksten bis zur schwächsten Grundfarbe sortieren

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Nach der stärksten bis zur schwächsten Grundfarbe sortieren

Beitrag von Nixsager »

Hi

Ich weiß es gibt extra Sortiermethoden. Aber die will ich erst mal nicht nutzen, sonst lernen ich ja nichts.

Ich will mir von den drei Grundfarben-Werten die Reihenfolge bzw. die Position von der stärksten bis zu dem schwächsten Wert ausgeben lassen.
So das wenn Rot den Wert $65, Grün den Wert $27, und Blau den Wert $45 hat, das mir die Reihenfolge bzw. die Position 3 für den Wert von Rot, dann 1 für den Wert von Grün und dann 2 für den Wert von Blau.

Für eine andere Funktion habe ich mir eine NearestInteger-Funktion gebaut.

Code: Alles auswählen

 
Function NearestInteger(Const Main, IntegerA, IntegerB: SInt32): SInt32;
 

Bei dieser Funktion wird mir die Ganzzahl zurückgegeben, die am nächsten des Main-Wertes ist.
Habe die Werte von 'IntegerA' und 'IntegerB' zu 'Main' den selben Abstand, wird mir 'IntegerA' zurückgegeben.

Zuerst dachte ich mir, diese Funktion in einer Schleife laufen zu lassen, aber dann hatte ich die Idee, die NearestInteger-Funktion anzupassen.
Aber das gelang mir auch nicht.

Code: Alles auswählen

 
   IF (RedColor > GreenColor) and (RedColor > BlueColor) then
      Result := 1;
   IF (GreenColor > RedColor) and (GreenColor > BlueColor) then
      Result := 2;
   IF (BlueColor > RedColor) and (BlueColor > GreenColor) then
      Result := 3;
 

Bei dieser Methode kriege ich zwar den Wert für die stärkste Farbe, aber wenn zwei Farben identisch sind kriege ich logischerweise den Wert '0' zurück, und ich kann mir die Position der stärksten Farbe nicht zurückgeben.

Hat einer eine Idee wie ich das Problem lösen kann?
Mir scheint meinen Schleifen-Idee nicht so falsch zu sein, da ich damit ja schon einen Vergleich mache.

Gruß vom Nixsager
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

LazyBone
Beiträge: 6
Registriert: Do 21. Apr 2016, 14:20

Re: Nach der stärksten bis zur schwächsten Grundfarbe sortie

Beitrag von LazyBone »

Hai Nixsager!

Wie du ja schon selber feststellst, ist es unmöglich, den stärksten Farbanteil anzugeben, wenn die zwei größten Farbanteile denselben Wert haben.
Da ich leider nicht weiß, wie du diese Farbstärke nutzen möchtest oder was du generell vorhast, bleibt mir gerade nur der Vorschlag, deine Fallunterscheidung ggf. zu erweitern und quasi noch "Sonderfälle" wie "rot und blau sind am größten und gleich => result = 4" etc. zu erweitern. Hier käme dann wohl auch die erwähnte For-Schleife zum tragen, indem du alle Farbanteile schrittweise untersuchst und feststellen kannst, ob es gleiche Werte gibt.

Viele Grüße

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Nach der stärksten bis zur schwächsten Grundfarbe sortie

Beitrag von Mathias »

Da ich leider nicht weiß, wie du diese Farbstärke nutzen möchtest oder was du generell vorhast,


Ich denke, er will es für dies da: viewtopic.php?f=25&t=10208&p=89905#p89905
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Nach der stärksten bis zur schwächsten Grundfarbe sortie

Beitrag von wp_xyz »

Was verstehst du eigentlich unter "Farbstärke"? Den Begriff habe ich noch nie gehört. Vielleicht meinst du eine Komponente aus der HSL-Farbdarstellung (H = Hue = Farbton, S = Saturation = Sättigung, L = Lightness = Helligkeit). Dazu findest du in der Unit GraphUtil die Routinen ColorToHLS, HLSToColor usw.

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Nach der stärksten bis zur schwächsten Grundfarbe sortie

Beitrag von Nixsager »

wp_xyz hat geschrieben:Was verstehst du eigentlich unter "Farbstärke"?

Stärke=Kräftiger. Vieleicht gibt es die Bezeichnung gar nicht.
Der Wert $FF ist stärker/kräftiger/höherwertig als der Wert $AA.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Nach der stärksten bis zur schwächsten Grundfarbe sortie

Beitrag von theo »

Aber $FF ist keine Farbe.

Welche Farbe ist "stärker" $FF0000 oder $0000FF ?
Schwer zu sagen oder?

Der Tipp mit HSL ist schon richtig.

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Nach der stärksten bis zur schwächsten Grundfarbe sortie

Beitrag von Nixsager »

theo hat geschrieben:Aber $FF ist keine Farbe.

Drücke ich mich wirklich so schwer aus?

Ich teile die Farbe in die additive Grundfarben Rot, Grün und Blau auf.
Dann will ich die Reihenfolge der Grundfarbe mit dem höchsten Wert und dann die nächste Farbe und so weiter, bis in die Reihenfolge habe.

theo hat geschrieben:Welche Farbe ist "stärker" $FF0000 oder $0000FF ?
Schwer zu sagen oder?

Nein nicht wirklich, bei dem was ich vor habe.
Bei deinem Beispiel müsste ich dann das Ergebnis 'RBG' raus bekommen.
R hat den maximalen Wert, also kommt es an erster Stelle, aber da Blau auch den maximal Wert hat, könnte es auch an erster Stelle kommen, da aber Rot bei der Eingabe vor Blau kam, bleibt sie an erster Stelle und somit kommt Blau an zweiter Stelle. Und da Grün einen niedrigeren Wert als Rot und Blau hat, kommt es bei der Ausgabe nach Rot und Blau.

theo hat geschrieben:Der Tipp mit HSL ist schon richtig.

Das ist eine interessante Idee, aber ich glaube, das verkompliziert das ganze.
Da die Eingabe und Ausgabe im RGB-Format ist, müsste ich das ganze umrechnen
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Nach der stärksten bis zur schwächsten Grundfarbe sortie

Beitrag von wp_xyz »

Nixsager hat geschrieben:Da die Eingabe und Ausgabe im RGB-Format ist, müsste ich das ganze umrechnen

Oh Mann! Wo ist das Problem, ColorToHLS(farbe, h, l, s) einzutippen? Das musst du doch nicht selbst ausrechnen!
Zuletzt geändert von wp_xyz am Fr 11. Nov 2016, 23:47, insgesamt 1-mal geändert.

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Nach der stärksten bis zur schwächsten Grundfarbe sortie

Beitrag von Nixsager »

Doch muss ich.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Nach der stärksten bis zur schwächsten Grundfarbe sortie

Beitrag von Jole »

Also so wie du das erklärst versteh ich das so das du die Grundfarben RGB sortieren willst, oder?
Zum Beispiel wäre $AAFFBB dann $FFBBAA, meinst du das so?

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Nach der stärksten bis zur schwächsten Grundfarbe sortie

Beitrag von Nixsager »

Exakt.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Nach der stärksten bis zur schwächsten Grundfarbe sortie

Beitrag von wp_xyz »

Jole hat geschrieben:Also so wie du das erklärst versteh ich das so das du die Grundfarben RGB sortieren willst, oder?
Zum Beispiel wäre $AAFFBB dann $FFBBAA, meinst du das so?

Verdammt noch mal! Wieso fehlt denn hier wieder das entscheidende Wort, so dass man den Satz versteht? Was heißt "zum Beispiel wäre $AAFFBB dann $FFBBAA"`? Größer als? Kleiner? Gleich?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Nach der stärksten bis zur schwächsten Grundfarbe sortie

Beitrag von Michl »

Naja, ich verstehe schon, was Nixsager versucht zu fragen. In etwas so: Wie könnte eine Funktion aussehen, die mir die Wichtung der Farbkanäle angibt?

Beispiele:
Rot, Grün, Blau -> Wichtung
$FF, $80, $00 -> 1, 2, 3
$80, $FF, $A0 -> 3, 1, 2
$40, $80, $A0 -> 3, 2, 1

Die Frage, die immer noch im Raum steht, ist die, wie mit mit Farben, wie Weiß oder Schwarz verfahren werden soll? Also mit Farben, die zwei oder mehr Kanäle den gleichen roten, grünen oder/und blauen Farbkanalwert haben?

Bsp:
Rot, Grün, Blau -> Wichtung
$FF, $FF, $00 -> 1, 1, 3 oder 1, 2, 3 oder 2, 1, 3
$A0, $FF, $A0 -> 2, 1, 2 oder 2, 1, 3 oder 3, 1, 2
$00, $00, $00 -> 1, 1, 1 oder 1, 2, 3 oder 3, 3, 3 oder 3, 2, 1 oder ...

Solange diese Frage nicht beantwortet ist, ist es unmöglich eine korrekte Anwort zu geben. Ansonsten ist es eine Funktion, die innerhalb weniger als 5 Minuten geschrieben ist (und mir auf Anhieb mehrere Möglichkeiten zur Realisierung einfallen).

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Nach der stärksten bis zur schwächsten Grundfarbe sortie

Beitrag von Nixsager »

Michl hat geschrieben:Die Frage, die immer noch im Raum steht, ist die, wie mit mit Farben, wie Weiß oder Schwarz verfahren werden soll? Also mit Farben, die zwei oder mehr Kanäle den gleichen roten, grünen oder/und blauen Farbkanalwert haben?

Habe ich die nicht schon gegeben?

Nixsager hat geschrieben:R hat den maximalen Wert, also kommt es an erster Stelle, aber da Blau auch den maximal Wert hat, könnte es auch an erster Stelle kommen, da aber Rot bei der Eingabe vor Blau kam, bleibt sie an erster Stelle und somit kommt Blau an zweiter Stelle. Und da Grün einen niedrigeren Wert als Rot und Blau hat, kommt es bei der Ausgabe nach Rot und Blau.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Nach der stärksten bis zur schwächsten Grundfarbe sortie

Beitrag von Michl »

Nixsager hat geschrieben:Habe ich die nicht schon gegeben?
Ja, sorry, habe ich übersehen.

Eine Variante wäre z.B. so (falls ich keinen Denkfehler habe):

Code: Alles auswählen

program Project1;
 
uses
  sysutils, Math;
 
procedure WeightOfColors(Red, Green, Blue: Byte; out RedWeight, GreenWeight, BlueWeight: Byte);
var
  i, aMax: Byte;
begin
  RedWeight := 0;
  GreenWeight := 0;
  BlueWeight := 0;
  for i := 1 to 3 do
  begin
    aMax := MaxIntValue([Red, Green, Blue]);
    if (Red = aMax) and (RedWeight = 0) then
    begin
      Red := 0;
      RedWeight := i;
      Continue;
    end;
    if (Green = aMax) and (GreenWeight = 0) then
    begin
      Green := 0;
      GreenWeight := i;
      Continue;
    end;
    BlueWeight := i;
    Blue := 0;
  end;
end;
 
var
  r, g, b, rw, gw, bw, i: Byte;
 
begin
  for i := 0 to 19 do
  begin
    r := Random(256);
    g := Random(256);
    b := Random(256);
    WeightOfColors(r, g, b, rw, gw, bw);
    WriteLn(Format('Rot(%d) %d. - Gruen (%d) %d. - Blau(%d) %d.', [r, rw, g, gw, b, bw]));
  end;
end.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten