NEWS
*GELÖST* HSV to RGB Script Frage/ Hilfe
-
Hi, ich bräuchte mal Hilfe.
Und zwar möchte ich gerne HSV Werte umwandeln in RGB Werte.
Ich habe das hier gefunden und schon ein wenig probiert, aber bekomme es nicht hin.
Das Original Script:
! ````
/* accepts parameters- h Object = {h:x, s:y, v:z}
- OR
- h, s, v
*/
function HSVtoRGB(h, s, v) {
var r, g, b, i, f, p, q, t;
if (arguments.length === 1) {
s = h.s, v = h.v, h = h.h;
}
i = Math.floor(h * 6);
f = h * 6 - i;
p = v * (1 - s);
q = v * (1 - f * s);
t = v * (1 - (1 - f) * s);
switch (i % 6) {
case 0: r = v, g = t, b = p; break;
case 1: r = q, g = v, b = p; break;
case 2: r = p, g = v, b = t; break;
case 3: r = p, g = q, b = v; break;
case 4: r = t, g = p, b = v; break;
case 5: r = v, g = p, b = q; break;
}
return {
r: Math.round(r * 255),
g: Math.round(g * 255),
b: Math.round(b * 255)
};
}
Das was ich gerne machen möchte: Ich habe 3 Objekte (h,s,v) wo z.B. die Werte drin sind: h=120 s=100 v=100 (Farbe Grün) Jetzt möchte ich gerne das in den 3 Objekten die ich angelegt habe (r,g,b) die Werte für Grün dann drin stehen (0,255,0) Ich habe das probiert, aber ohne Erfolg. Weiß jemand wie es richtig gemacht wird?
/* accepts parameters
- h Object = {h:x, s:y, v:z}
- OR
- h, s, v
*/
function HSVtoRGB(
h = getState("javascript.0.Geraete.Arduino.hue").val,
s = getState("javascript.0.Geraete.Arduino.saturation").val,
v = getState("javascript.0.Geraete.Arduino.dimmer").val){
var r, g, b, i, f, p, q, t;
if (arguments.length === 1) {
s = h.s, v = h.v, h = h.h;
}
i = Math.floor(h * 6);
f = h * 6 - i;
p = v * (1 - s);
q = v * (1 - f * s);
t = v * (1 - (1 - f) * s);
switch (i % 6) {
case 0: r = v, g = t, b = p; break;
case 1: r = q, g = v, b = p; break;
case 2: r = p, g = v, b = t; break;
case 3: r = p, g = q, b = v; break;
case 4: r = t, g = p, b = v; break;
case 5: r = v, g = p, b = q; break;
}
return {
r: Math.round(r * 255),
g: Math.round(g * 255),
b: Math.round(b * 255)
};setState("javascript.0.Geraete.Arduino.r1"/r1/, r),
setState("javascript.0.Geraete.Arduino.g1"/g1/, g),
setState("javascript.0.Geraete.Arduino.b1"/b1/, b);}
-
/push
-
Eine Funktion wird nur abgearbeitet, wenn sie auch aufgerufen wird.
// Initialisierung bei Skriptstart var h = getState("javascript.0.Geraete.Arduino.hue").val; var s = getState("javascript.0.Geraete.Arduino.saturation").val; var v = getState("javascript.0.Geraete.Arduino.dimmer").val; function HSVtoRGB() { var r, g, b, i, f, p, q, t; i = Math.floor(h * 6); f = h * 6 - i; p = v * (1 - s); q = v * (1 - f * s); t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: r = v, g = t, b = p; break; case 1: r = q, g = v, b = p; break; case 2: r = p, g = v, b = t; break; case 3: r = p, g = q, b = v; break; case 4: r = t, g = p, b = v; break; case 5: r = v, g = p, b = q; break; } setState("javascript.0.Geraete.Arduino.r1"/*r1*/, Math.round(255 * r)); setState("javascript.0.Geraete.Arduino.g1"/*g1*/, Math.round(255 * g)); setState("javascript.0.Geraete.Arduino.b1"/*b1*/, Math.round(255 * b)); } // Ende der Funktion HSVtoRGB(); // Aufruf bei Skriptstart on("javascript.0.Geraete.Arduino.hue", function(dp) { h = dp.state.val; HSVtoRGB(); // Aufruf bei Änderung von hue }); on("javascript.0.Geraete.Arduino.saturation", function(dp) { s = dp.state.val; HSVtoRGB(); // Aufruf bei Änderung von saturation }); on("javascript.0.Geraete.Arduino.dimmer", function(dp) { v = dp.state.val; HSVtoRGB(); // Aufruf bei Änderung von dimmer });
EDIT: Faktor 255 bei setState() zugefügt.
-
Leider funktioniert es so noch nicht.
Ganz oben stimmt was mit der Klammer nicht.
hm..
-
Sorry. Die Variablendeklaration stimmt nicht (Semikolon).
// Initialisierung bei Skriptstart var h = getState("javascript.0.Geraete.Arduino.hue").val; var s = getState("javascript.0.Geraete.Arduino.saturation").val; var v = getState("javascript.0.Geraete.Arduino.dimmer").val;
Sowas kommt von Copy & paste.
-
Kann sein das was an der Formel nicht stimmt. Es ändert sich nichts. Es werden keine Werte gesetzt in r,g,b.
r1 hat immer den Wert 255… b.z.w. 100.. grad nochmal geguckt
g1 u. b1 haben immer 0
hm..
-
Sieht für mich aus als wird hue, sat, brightness im Bereich von 0..1 erwartet, nicht 0..360 bzw. 0..100. Probier mal folgende Änderung:
on("javascript.0.Geraete.Arduino.hue", function(dp) { h = dp.state.val / 360; HSVtoRGB(); // Aufruf bei Änderung von hue }); on("javascript.0.Geraete.Arduino.saturation", function(dp) { s = dp.state.val / 100; HSVtoRGB(); // Aufruf bei Änderung von saturation }); on("javascript.0.Geraete.Arduino.dimmer", function(dp) { v = dp.state.val / 100; HSVtoRGB(); // Aufruf bei Änderung von dimmer });
und außerdem
// Initialisierung bei Skriptstart var h = getState("javascript.0.Geraete.Arduino.hue").val / 360; var s = getState("javascript.0.Geraete.Arduino.saturation").val / 100; var v = getState("javascript.0.Geraete.Arduino.dimmer").val / 100;
-
Super. Funzt… Danke schön
-
Hallo zusammen,
darf ich das Thema nochmal aufnehmen ?
Habe das ganze halbwegs ans laufen bekommen.
Mir werden allerdings Kommazahlen für r g und b ausgegeben. wie runde ich die ?
Danke für eure Hilfe
-
@rom-wagner80 Math.Round(); würde ich sagen oder .Ceil() zum aufrunden oder .floor() zum abrunden