Rgb-farbwert berechnen

Hallo,
Ich programmiere zur Zeit in c++ mit OpenGL ein Programm zur Temperaturberechnung. Nun hakts aber an einer Stelle.

Ich möchte nämlich aus einem Temperaturwert (float) eine Farbe berechnen. Es git mehrere Temperaturwerte, die einen Durchschnittswert bilden. Anhand dieser DAten möchte ich einen RGB-FArbwert berechnen (zahlenraum: 0 bis 1). ich weiß nun aber nicht, wie die beste Strategie dabei ist.
Auf jeden Fall sollte die tiefe Temperatur im blauen Farbbereich liegen, die hohe im roten und die mittlere im grünen.

MFG clusidc

P.S.: Dies ist keine Hausaufgabe.
mein bisheriger Code:

void Temparray::coloring() {
float r[4], g[4], b[4];
for(int i=0; i= 50 ) b[m]=0;
else b[m]=1/(50-temperatureold(i, j, k, l, m));
g[m]=fabs(1/(50-temperatureold(i, j, k, l, m)));
if(temperatureold(i, j, k, l, m)

Dieses Code ding funzt nicht… ICh bitte einen Moderator die zu korrigieren(falls es kein Board fehler ist).

Hallo,

Anhand dieser DAten möchte ich einen
RGB-FArbwert berechnen (zahlenraum: 0 bis 1). ich weiß nun
aber nicht, wie die beste Strategie dabei ist.
Auf jeden Fall sollte die tiefe Temperatur im blauen
Farbbereich liegen, die hohe im roten und die mittlere im
grünen.

Es gibt einen CIE-Farbraum (googeln) in dem alle Farben in zwei Dimensionen (x und y) abgelegt sind. Nicht die gesamte Fläche ist mit Farbe gefüllt, eher ein schräges „Hufeisen“. Links unten ist blau, mitte oben ist grün, rechts unten ist rot. Auf dieser Linie liegen alle „Regenbogenfarben“, die jeweils aus 2 der 3 Grundfarben zusammengesetzt sind. Zwischen rot und grün liegt dann orange und gelb, zwischen grün und blau liegt türkies. Wenn Du diese Farben zulässt, habe ich folgenden Vorschlag :

Wert / rotanteil / grünanteil / blauanteil
1 / 100% / 0% / 0%
0.75 / 50% / 50% / 0%
0.62 / 25% / 75% / 0%
0.5 / 0% / 100% / 0%
0.12 / 0% / 25% / 75%
0.0 / 0% / 0% / 100%

Hoffe aus der Tabelle ist die Idee zu erkennen. Algorythmus dürfte nicht so schwer werden. Erst entscheiden welche beiden Farben ( 0.5, dann Anteile berechnen).

Oder, so ähnlich, oder auch ganz anders. Möglich ist auch, dass Grauwerte besser erkennbar sind statt Farben:

Wert / rotanteil / grünanteil / blauanteil
1 / 100% / 100% / 100%
0.75 / 75% / 75% / 75%
0.62 / 62% / 62% / 62%
0.5 / 50% / 50% / 50%
0.12 / 12% / 12% / 12%
0.0 / 0% / 0% / 0%

fröhliches programmieren,

Uwe P.

Grundsätzliche Frage:

Hat nicht Rot eine niedrige Farbtemperatur und blau eine hohe?

Hu hu,

ohne das die Antwort warscheinlich allzu qualifiziert aussieht^^.

Wie wärs denn, wenn du deine Temperatur auf einen Wert normierst.

Ich mein, du legst dir deine Grenzwerte fest.
Zum Beispiel 100°C ist deine höchste Temperatur und 0°C ist deine kleinste darzustellende Temperatur.
Diese beiden Werte setzt du zu 100% und 0%. Jetzt kannst du deine gemessenen Temperaturen darauf beziehen.
Als letzten Schritt kannst du ja deinen Rotwert = deinem berechneten Wert nehmen und den Blauwert 100% - dem berechneten Wert. Dann solltest du eine nette Farbverteilung bekommen ( habs allerdings nicht ausprobiert ).

PS: nicht hauen wenns nicht geht. Das ist mir einfach als erstes eingefallen^^.

PPS: für rechtschreibfehler haftet die Tastatur.

Damle für die Antwort, sie hat mir sehr geholfen. Ich bitte jemanden den jetzigen code sich mal anzusehen, da ich es mit meinem Programm nicht richtig erkennen kann, ob er es jetzt richtig anzeigt oder nicht.

ich hab eine leicht veränderte version dieser Tabelle genommen

Wert / rotanteil / grünanteil / blauanteil
1 / 100% / 0% / 0%
0.75 / 100% / 100% / 0%
0.625 / 50% / 100% / 0%
0.5 / 0% / 100% / 0%
0.125 / 0% / 50% / 100%
0.0 / 0% / 0% / 100%

percent = temperatureold(i, j, k, l, m)/100;

if (percent b[m]){
 factor = 1 + (1-g[m]) / g[m];
 }
 else {
 factor = 1 + (1-b[m]) / b[m];
 }
 g[m] \*= factor;
 b[m] \*= factor;
}
else if (percent == 0.5) {
 r[m] = 0;
 g[m] = 1;
 b[m] = 0;
}
else if (percent \> 0.5) {
 r[m] = (percent-0.5)\*2;
 g[m] = 1-(percent-0.5)\*2;
 b[m] = 0;

 if(r[m] \> g[m]){
 factor = 1 + (1-r[m]) / r[m];
 }
 else {
 factor = 1 + (1-g[m]) / g[m];
 }
 r[m] \*= factor;
 g[m] \*= factor;
}

Mfg Clusidc

Hallo,

welchen Vorteil hat Deine geänderte Tabelle ?

  • grössere Helligkeitsschwankungen
  • Farbkonzentration um die 3 Grundfarben
  • längere Berechnung, mehr Code
    Bitte nicht so sparsam mit den Kommentaren, vereinfacht das Verständnis.
    Ein KISS Vorschläg wäre

percent = temperatureold(i, j, k, l, m)/100; // 0 -> 1

r[m] = 0;
b[m] = 0 ;
if (percent 0
r[m] = 1 - g[m] ;
}

Mfg Uwe P.