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.