28.10.2021
Der nachfolgende Algorithmus in Pseudocode wandelt eine RGB-Farbe in eine HLS-Farbe um. Bitte implementieren Sie den Pseudocode als Programm in der Sprache Java. Verwenden Sie dafür eine Programmierumgebung Ihrer Wahl. Die Zeilen zwischen “/*” und “*/” sind ein Kommentar und dienen lediglich der Erläuterung der Funktionalität des Programms, sind aber nicht Bestandteil Ihres fertigen Programms. Rechnen Sie mit Ihrem Programm die RGB-Farbe (0.5, 0.7, 0.3) in eine HLS-Farbe um und notieren Sie das Ergebnis. Dabei gehen wir von einem Wertebereich der Farbparameter von [0..1] aus, und wir verwenden die englische bzw. informatikübliche Schreibweise, bei der der “Nachkommaanteil” einer Dezimalzahl mit Hilfe eines Punkts anstelle eines Kommas angezeigt wird. Geben Sie bitte Ihr Programm und das Rechenergebnis an.
/*
Algorithmus in Pseudo-Code
RGB nach HLS, angelehnt an: J. Burg, The Science of Digital Media, Pearson 2009, S. 93.
Input: r,g b sind reelle Zahlen im Wertebereich [0…1]
Output: h ist eine reelle Zahl im Wertebereich [0…360], mit Ausnahme des Falls s = 0; in diesem Fall ist h nicht definiert. l und s sind reelle Zahlen im Wertebereich [0…1].
r,g,b stehen für Rot, Grün, Blau; h,l,s stehen für Hue, Lightness, Saturation.
Beachten Sie, dass “==” für das sonst in Mathe verwendete, einfache Gleichheitszeichen steht, und “=” für eine Zuweisung.
*/
max = maximum(r,g,b)
min = minimum(r,g,b)
l = average(max, min)
if max == min then s = 0
else
{
sum = max + min
diff = max − min
if l ≤ 0.5 then s = diff / sum
else s = diff / (2 − max + min)
r_temp = (max − r) / diff
g_temp = (max − g) / diff
b_temp = (max − b) / diff
if r == max then h = b_temp − g_temp
else if g == max then h = 2 + r_temp − b_temp
else if b == max then h = 4 + g_temp − r_temp
h = h * 60
if h < 0 then h = h + 360
}Der Pseudocode lässt sich in folgenden Java-Code umwandeln:
import java.util.Scanner;
public class uebung17 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Geben Sie den Rot-Wert an [0; 1]: ");
double r = scanner.nextDouble();
System.out.print("Geben Sie den Grün-Wert an [0; 1]: ");
double g = scanner.nextDouble();
System.out.print("Geben Sie den Blau-Wert an [0; 1]: ");
double b = scanner.nextDouble();
double h = 0, s = 0, l = 0;
double max = Math.max(Math.max(r, g),b);
double min = Math.min(Math.min(r,g),b);
l = (max + min) / 2.0;
if (max == min) s = 0;
else {
double sum = max + min;
double diff = max - min;
if (l <= 0.5) s = diff / sum;
else s = diff / (2.0 - max + min);
double r_temp = (max - r) / diff;
double g_temp = (max - g) / diff;
double b_temp = (max - b) / diff;
if (r == max) h = b_temp - g_temp;
else if (g == max) h = 2 + r_temp - b_temp;
else if (b == max) h = 4 + g_temp - r_temp;
h = h * 60;
if (h < 0) h = h + 360;
}
System.out.println("Der RGB-Wert (" + r + ", " + g + ", " + b + ") entspricht dem HSL-Wert (" + h + ", " + s + ", " + l +").");
}
}Für die Eingabe r=0.5, g=0.7, b=0.3 erhält man folgende Ausgabe:
Geben Sie den Rot-Wert an [0; 1]: 0,5
Geben Sie den Grün-Wert an [0; 1]: 0,7
Geben Sie den Blau-Wert an [0; 1]: 0,3
Der RGB-Wert (0.5, 0.7, 0.3) entspricht dem HSL-Wert (90.0, 0.39999999999999997, 0.5).Also ungefähr: h=90, s=0.4, l=0.5