Aufgabenstellung: ----------------- Ein Farbwert im RGB-Farbwürfel soll auf einen Farbwürfel mit 147 Farbwerten abgebildet werden. Das entspricht einem Reduktionsver- hältnis von 256:256:256 zu 7:7:3. Die Farbgrenzen sollen gerundet werden und für alle 8-Eckpunkte soll der normierte Abstand zum eingegebenen Punkt errechnet werden. Dank des ausgezeichneten Programms "farb1.java" konnte die neue Aufgabenstellung durch austauschen bzw. erweitern des Programmcodes erledigt werden. Im folgenden wird nur auf die neuen bzw. auf die überarbeiteten Programmteile eingegangen. Geändert bzw. erweitert: ------------------------ o SHORT-Variablen wurden durch INT(eger)-Variablen ersetzt. Diese Änderung ist bitte beim lesen der unten angefügten Original- dokumentation zu berücksichtigen! o Um den normierten Abstand aller Eckpunkte zu errechnen, musste neben dem Abstand, welcher in der Variable "distance" gespeichert wird, auch die Summe aller Abstände bereitgestellt werden. Hierfür wurde die Variable "sumDistance" eingeführt. Beim ermittlen des Abstands (= "distance") wird gleichzeitig die Summierung der Abstände durchgeführt. Die Variable "distance" wurde um eine Dimension erweitert (aus distance[] wurde distance[][]). In der Dimension "0" befindet sich der errechnete Abstand. Mit dem in "sumDistance" befindlichen Wert, lässt sich nun der normierte Abstand errechnen, welcher in Dimension "1" von "distance" ab- gelegt wird. o Da die Ausgabe die normierten Eckpunkte in "aufsteigender"-Reihen- folge erwartet, musste ein Sortierung des Array's "distance" durch- geführt werden. Als Sortieralgorithmus wurde das "BubbleSort"-Verfahren ausgewählt. Die Sortierung erfolgt in der Methode "dSort2D", welche als Parameter den Array "distance" (den Pointer auf distance) erhält. o Die Ausgabe musste natürlich ausgetauscht werden. Für die Ausgabe wird einfach der Array "distance", der nach "dSort2D" sortiert vor- liegt, durchlaufen und ausgegeben. o Zusätzlich wurde eine "Debug"-Funktion eingebaut, um mir und all jenen die dieses Programm angucken müssen das leben zu erleichtern. Die Debug-Funktion wird mittels der Konstante "dbgOn" gesteuert. Die Funktion ist aktiv, wenn der Wert der Konstante auf "true" ge- setzt wird. Ist "dbgOn=true" erfolgt vor der Eprog-Ausgabe eine detailliertere Ausgabe des Array's "distance". _____________________________________________________________________________ ORIGINAL-Beschreibung von Stefan Ehmann Kurzbeschreibung: ----------------- Ein Farbwert im RGB-Farbwürfel (Rot, Grün, Blau je 256 Stufen) soll auf einen von 256 Farbwerten abgebildet werden. Die main()-Methode ------------------- Es werden die RGB Werte vom Typ short eingelesen und als RgbValue gespeichert. Um den 24-Bit RGB-Wert auf 8-Bit zu konvertieren, müssen die Helligkeiten für Rot-Grün-Blau von 256:256:256 auf 8:8:4 reduziert werden. Dabei wird der RGB-Farbraum in Quader unterteilt. Diese Abstufungen werden dadurch erreicht, dass 255:7 (für Rot und Grün) bzw. 255:3 (für Blau) geteilt wird. Diese Grenzen (entspricht Kanten des Quaders) werden für Rot und Grün im array rgBorder[] und für Blau im array bBorder[] gespeichert. Der eingegebene RGB-Wert wird mit den Grenzen verglichen um festzustellen, in welchem Quader der Wert liegt. Die Überprüfung erfolgt relativ umständlich, indem der Wert mit den einzelnen Grenzen verglichen wird. Würde diese direkt über eine Formel erfolgen, käme es aufgrund von Rundungsfehlern zu anderen Ergebnissen. Von jeder Koordinatenachse werden die unterhalb und oberhalb liegenden Grenzen des Quaders gespeichert (z.B. rLo für untere Grenze von Rot). Mithilfe dieser insgesamt sechs Grenzen kann man die Eckpunkte des Quaders bestimmen. Diese werden im array Corners[] gespeichert. Als Ergebnis sollen der nächstgelegene und der entferntete Eckpunkt ausgegeben werden. Dazu werden die einzelnen Abstände im array distance[] gespeichert. Der Abstand wird mithilfe der distance()-Methode ermittelt. In einer Schleife wird der aktuelle Abstand immer mit dem zur Zeit minimalen Abstand verglichen und bei Bedarf als neuer Minimalabstand gesetzt. Analog funktioniert der Maximalabstand. In curMin und curMax wird dann der Index jenes Eckpunktes gespeichert, der am wenigsten bzw. am weitesten entfernt ist. Ein Spezialfall muss noch behandelt werden: Liegt der RGB-Wert auf einem Eckpunkt, so ist dieser sowohl als nächster als auch weitester Eckpunkt aufzufassen. Dazu reicht es zu überprüfen, ob der Eckpunkt mit dem am wenigsten entfernten Eckpunkt identisch ist. Somit sind die Berechnung abgeschlossen und die Ausgabe der Ergebnisse kann erfolgen: Dabei ist zu beachten, dass der erste Wert explizit in einen String umgewandelt werden muss um zu erreichen, dass die einzelnen Werte ausgegeben werden, und nicht die Summe dieser. Die Klasse RgbValue: -------------------- Konstruktor: Dem Konstruktor müssen als Parameter 3 Variablen vom Typ short übergeben werden, die die jeweiligen Rot-, Grün- und Blau-Werte repräsentieren. Falls die Werte außerhalb des Gültigkeitsbereiches liegen, wird eine Ausnahme geworfen. Methoden: equals() vergleicht die Datenelemente komponentenweise und gibt true zurück, falls sie übereinstimmen, andernfalls false. distance() berechnet den Abstand zwischen zwei RGB-Values und gibt diesen als double zurück Elemente: red, green, blue: Diese short-Variablen enthalten die entsprechenden Rot-, Grün- und Blauwerte Fehlerbehandlung: ----------------- Mittels catch werden am Ende von farb1.main() Ausnahmen gefangen. Dabei werden zwei Arten von Fehlern unterschieden. 1. Die Eingabe enthälte einen (oder mehrere) falsche Datentypen. 2. Alle Eingaben sind vom richtigen Datentyp, allerdings außerhalb des gültigen Wertebereichs. Im 1. Fall wird "?" ausgegeben, im 2. Fall "FALSCHE EINGABE" Die Entscheidung, welcher Fehler auftritt wird getroffen, indem die message der EprogException überprüft wird.