3132 Konvhuel Konvexe Huelle
Kategorie:Grafik
Klasse:mittel
Eingabe:siehe Spezifikation
Ausgabe:siehe Spezifikation
Abzugebende Files: Konvhuel.txt, Konvhuel.java, *.java , 785.txt, 915.txt

Kurzbeschreibung:

Eine Menge von Punkten wird eingelesen; jene Punkte, die der konvexen Huelle angehören, werden ausgegeben.

Allgemeine Hinweise:

Aufgabenstellung:

Lesen Sie eine Menge von Punkten ein. Finden Sie nun jene Punkte, die der konvexen Hülle dieser Menge angehören.

Eine konvexe Hülle ist, kurz gesagt, die Menge der kürzesten Pfade, die die gesamte Punktmenge umschließen. Die Ecken dieser Polygon-Hülle sind Grenzpunkte aus der ursprünglichen Punktmenge. Punkte, die auf einer Verbindung zweier Punkte der konvexen Hülle liegen, sind ebenfalls Punkte der konvexen Hülle.

Ein anschauliches Beispiel:

Um diese Aufgabe zu lösen, beginnen Sie mit dem Polygon, das aus den ersten drei Punkten besteht. Überprüfen Sie, ob der nächste Punkt außerhalb dieses Polygons liegt. Wenn ja, passieren zwei Sachen: Der neue Punkt wird (vorerst) in die Hülle aufgenommen (die geeignete Stelle in der Liste finden Sie dadurch, daß sich die Strecken der Hülle nicht schneiden dürfen.)

Weiters wird überprüft, ob ältere Punkte aus der Hülle wieder entfernt werden müssen. Dazu überprüfen Sie für jeden Punkt der Hülle, ob er im Polygon liegt, das aus den anderen Punkten der Hülle gebildet wird. Wenn die Hülle z.B. aus (A,B,C,D) besteht und nun Punkt E hinzukommt, dann muß geprüft werden, ob A in (B,C,D,E) liegt, ob B in (A,C,D,E) liegt etc.

Diesen Vorgang wiederholen Sie für alle Punkte.

Eingabedaten:

Lesen Sie die Koordinaten der Punkte als Zahlen vom Typ Integer ein. Die Reihenfolge ist x1, y1, x2, y2 etc. Ein zulässiger Datensatz besteht aus mindestens 3 und maximal 30 Punkten. Der Datensatz ist außerdem fehlerhaft, wenn alle Punkte auf einer Geraden liegen.

Die Eingabe wird durch ein beliebiges Zeichen, das statt einer neuen x-Koordinate eingegeben wird, abgeschlossen.

Ausgabedaten:

Bei korrekten Eingabedaten soll Ihr Programm jene Punkte ausgeben, die der konvexen Hülle angehören. Dabei sollen die Koordinaten jedes Punktes in der Form (x,y) z.B. (3,5) ausgegeben werden; die einzelnen Punkte sind durch Leerzeichen zu trennen.

Sortieren Sie die Punkte aufsteigend nach der X-Koordinate, innerhalb gleicher X aufsteigend nach Y.

Geben Sie am Ende einen Zeilenvorschub aus.

Fehlerbehandlung:

Genügen die eingelesenen Daten nicht den Bedingungen (z.B. auch ungütiger Datentyp bei einer Y-Koordinate), dann soll die Meldung "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub ausgegeben werden.

Lesen Sie aber auf jeden Fall solange Zahlen ein, bis ein Endezeichen kommt.

Beispiele:

Eingabedaten
-1 -1 1 2 2 2 1 1 3 1 -1 0 -2 -2 x

0 0 5 5 5 0 x

Ausgabedaten
(-2,-2) (-1,0) (1,2) (2,2) (3,1)

(0,0) (5,0) (5,5)


Testen:

Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei erzeugen:

java Konvhuel < Konvhuel.i1 > Konvhuel.out1

Das erzeugte File Konvhuel.out1 können Sie dann mit dem mitgelieferten Outputfile Konvhuel.o1 vergleichen.