/////////////////////////////////////////////////////////////////////
Maximieren Sie das Fenster, um die Datei im urspr◯nglich vorgesehenen
Layout zu lesen
////////////////////////////////////////////////////////////////////
Datei: Dreieck.txt
       Dokumentation zu Dreieck.java
Author: Benedikt Huber
Matrikelnummer: 0060387
e-mail: e0060387@student.tuwien.ac.at
Erstellungsdatum: 09.12.2001

********************************************************************
Aufgabenstellung lt. Spezifikation
********************************************************************

- Seitenl∽ngen rechtwinkliger Dreiecke einlesen und ausgeben, ob sie
  sich l◯ckenlos so aneinander legen lassen, dass entweder ein Quadrat
  oder eine Raute entsteht

- Zuerst soll die Anzahl der einzulesenden Dreiecke gelesen
  werden(2-4)
- Bei einem ung◯ltigen Wert wird sofort abgebrochen und "FALSCHE
  EINGABE" ausgegeben 
- Bei einem g◯ltigen Wert werden pro Dreieck 3 float-Werte eingelesen
  (Alle Einlesen!!!)
- Die Seitenl∽ngen m◯ssen zwischen 0 und 30 liegen
- Bei einem ung◯ltigen Wert soll "FALSCHE EINGABE" ausgegeben werden
- Bei ung◯ltigen Datentypen soll  "?" ausgegeben werden

- Berechnungen sollen mit einer Genauigkeit von 0.3 durchgef◯hrt
  werden
- Wenn die 3 Seitenl∽ngen kein rechtwinkliges Dreieck ergeben, soll
  "FALSCHE EINGABE" ausgegeben werden
- Wenn die rechtwinkligen Dreiecke sich zu einem QUADRAT oder einer
  RAUTE zusammenlegen lassen, soll "J" ausgegeben werden
- Ansonsten "N"

********************************************************************
Theorie
I) Wann kann aus 3 Seitenl∽ngen ein Dreieck gebastelt werden
II) Wann ist dieses Dreieck Rechtwinklig
III) Wann lassen sich 2,3 od.4 Dreiecke zu einer Raute zusammenlegen
********************************************************************
ad I) 
Dreiecksungleichung: 
Zwei Seitenl∽ngen zusammen m◯ssen immer gr‡≡er als die Dritte sein

ad II) 
Satz von Phytagoras:
Die Summe der Quadrate der zwei k◯rzeren Seitenl∽ngen ist gleich dem
Quadrat der l∽ngsten Seitenl∽ngen (hinreichende Dreiecksungleichung)

ad III)
Anm.: Alle nachfolgenden Behauptungen wurden durch stundenlanges
Zeichnes und elendslange Forumsdiskussion bekr∽ftigt, werden aber
aufgrund fehlender Grafikm‡glichkeiten und um den Rahmen des
Lesefreudigkeit des Lesers nicht zu strapazieren, as short as possible
gehalten ;-) Zum Zeitpunkt der Erstellung waren die Grafiken unter
stud4.tuwien.ac.at/~e0060387 abrufbar 
Au≡erdem gibts am Ende des Files tolle ANSI-Bilder 

2 Dreiecke: 1 Fall -> QUADRAT
 Genau dann, wenn zwei identische,gleichschenkelige Dreiecke vorliegen

3 Dreiecke: 1 Fall -> QUADRAT
 Genau dann, wenn zwei identische,gleichschenkelige Dreiecke aneinandergelegt
 identisch mit dem dritten, ebenfalls gleichschenkligen Dreieck sind

4 Dreiecke: 3 F∽lle; 
  I) Rekursive Struktur
     - Die zwei kleinsten Dreiecke sind identisch
     - Aneinandergelegt identisch mit dem n∽chstgr‡≡ten
     - Fortfahren wie bei 3 Dreiecken
  II) Deltoid
     - Je 2 Dreiecke sind identisch -> Deltoid
     - 3 Sub-F∽lle
     a) - Als Deltoid betrachtet: f teilt e mittig
	- d.h. Alle vier Dreiecke sind identisch -> Raute
     b) - Als Deltoid betrachtet: e=a,f=a/2 -> Quadrat
        - d.h.: Je zwei Dreiecke ergeben ein Rechteck
	-       Die beiden Rechtecke zusammen ein Quadrat
     c) - Als Deltoid betrachtet: e=a, entweder AB oder BC sind = a
	- d.h Jeweils 2 unterschiedliche Dreiecke ergeben zusammengelegt
	  ein gleichschenkliges 
	- die identischen gleichschenkligen(aber nicht rechtwinkligen)
	  Dreiecke ergeben immer eine -> Raute 

  III) Loose One in the Middle (d.h. ein Dreieck liegt mit keiner Seite
       an dem Quadrat an)
     - 4 Verschiedene Dreicke ergeben Quadrat
     - 3 Sub-F∽lle
     a) Das Dreieck in der Mitte hat einen Eckpunkt in einem Eckpunkt des
       Quadrates, die anderen zwei Eckpunkte teilen jeweils eine Seite

       Algorithmus:
       - Fl∽cheninhalte addieren und Wurzelziehen => Quadratseite
       - Zwei Dreiecke haben Quadratseite als l∽ngere Kathete
       - F◯r die anderen 2 Dreiecke gilt: Die k◯rzere Kathete des gr‡≡eren
        Dreieckes(das "in der Mitte") ist gleich der Hypothenuse des letzten Dreieckes
       -  Die k◯rzere(oder l∽ngere, das ist egal) Kathete des letzten Dreieckes plus 
          die k◯rzere Kathete eines der beiden ersten 2 Dreiecke gleich a
       - HINREICHEND (Alle Seitenl∽ngen fixiert)!

     b) Das Quadrat wird durch 3 Dreiecke gebildet, das mittlere davon durch die H‡he in
        zwei rechtwinklige geteilt

       Algorithmus:
       - Fl∽cheninhalte addieren und Wurzelziehen => Quadratseite
       - Zwei Dreiecke haben Quadratseite als l∽ngere Kathete
       - Die l∽ngeren Katheten der anderen 2 Dreiecke sind gleich
       - Die Summe der k◯rzeren Katheten der ersten 2 Dreiecke ist a 
       - HINREICHEND (Alle Seitenl∽ngen fixiert)!
     
     c) Wiederum wird das Quadrat durch drei Dreiecke gebildet
        Dies ist jedoch der Spezialfall, wo eines dieser Dreiecke das Quadrat in zwei Dreiecke teil
	Ein H∽lfte des Quadrats wid wieder in 2 Dreiecke geteilt (eines davon rechtwinklig)
	Das nicht rechtwinklige durch die H‡he wieder in zwei Dreiecke (ohne Gfx braucht man halt
	imaginiation)

       Algorithmus:
       - Fl∽cheninhalte addieren und Wurzelziehen => Quadratseite
       - Zwei Dreiecke haben Quadratseite als l∽ngere Kathete
       - Das gr‡≡te Dreieck ist Gleichschenklig
       - Die k◯rzeren Katheten der anderen 2 Dreiecke sind gleich
       - Und schlie≡lich die Hypothenuse vom zweit- und drittgr‡≡ten Dreieck gleich
       - HINREICHEND (Alle Seitenl∽ngen fixiert)!


***********************************************************************************
Design-Goals
**********************************************************************************
I) Korrektheit
II) Sinnvolles! OOP und Verwendbarkeit
III) Lesbarkeit

ad I) imho das wichtigste bei einem Eprog-Programm
- Ich denke, dass ich alle F∽lle inkludiert habe; von dieser Seite her sollte 
die Korrektheit gegeben sein.
- ACHTUNG: Bei sehr kleinen Seitenl∽ngen(<0.5) erhalten Sie kein sinnvolles 
Ergebniss. Die Schuld daran tr∽gt die Spezifikation die eine ABSOLUTE Toleranz
(von 0.3) fordert(d.h. z.B. dass alle Werte zw. 0.1 und 0.4 identisch zu behandeln
sind). In diesem Sinne erf◯llt das Programm die Anforderungen der Spezifikation, nicht
aber die eines realen Problems. 
Anm.: Das Zulassen einer relativen Toleranz(z.B. 1%) w∽re sinnvoller gewesen, aber das
ist eine andere Geschichte ;-) 

ad II) 
- Alle Methoden, die in meinem Programm public definiert sind,
sind sinnvoll von au≡erhalb der Klasse zu
verwenden
- Einlesen,Verarbeiten sowie einzelne Teile der Verarbeitung
k‡nnen direkt von einer anderen Klasse angesteuert werden
- Die wichtigen Konstanten wie die R◯ckgabestrings oder die Genauigkeit 
k‡nnen statisch ver∽ndert werden

ad III) 
- Stil(Einr◯cken,Abs∽tzte) lt. Konvention
- JavaDoc-Kompatibilit∽t
- Neben den JavaDoc Kommentaren (Bl‡cke vor Methoden) nur kurze,pr∽gnante Comments zum
  ungef∽hren Verst∽ndniss (-> bessere Lesbarkeit) 

***********************************************************************************
Implentierungs-Details
**********************************************************************************

Um den Aufbau der Klasse auf einen Blick bestm‡glich erfassen zu k‡nnen geben sie
in der Kommandozeile "javadoc Dreieck.java -author -version" ein -> hier wird alles, was
public ist, ausf◯hrlich beschrieben

I) Klassen und Packages
II) Variablen und Konstanten
III) Programmablauf

ad I)
- public class Dreieck             Diese Klasse enth∽lt mein Programm(keine super/subclasses)
- eprog.EprogIO			   Importiert f◯r I/O
- java.util.Arrays		   Importiert zum Sortieren
- java.lang.Math		   Importiert f◯r Absolutbetrag und Wurzel

ad II)
- nur statische Konstanten zur Berechnung
- ich habe sie (noch) nicht final deklariert, da ein dritter ihnen m‡glicherweise neue
  Werte zuordnen will
- siehe JavaDoc

ad III)

Im folgenden wird der Programmablauf kurz skizziert:

1) main -> readInput: Einlesen, wenn ung◯ltiger Datentyp EprogException, wenn ung◯ltige Anzahl null -> main
2) main -> perform
   -> isRwDreieck: Schaun ob des g◯ltige Dreiecke sind -> perform 
4) -> sortDreiecke: Sortiert die rwDreiecke nach Hypothenuse, kleinste zuerst -> perform
5) -> istRaute: Schaut, ob sich Quadrat/Raute bilden l∽≡t 
   bei 2 Dreiecken -> istQuadrat_2: Berechne f◯r 2 Dreiecke -> perform->main
       3           -> ist Quadrat_3:	         3          -> istQuadrat_2 -> perform->main
	im Falle III -> istQuadrat_4: Berechnen ob Quadrat und zur◯ckgeben -> perform->main
	im Falle I -> zusammenf◯gen ->istQuadrat_3 -> istQuadrat_2 -> perform->main
	im Falle II: Berechnen ob Raute und zur◯ckgeben -> perform->main
6)  main: Drucke Ausgabestring

Zum Berechnen wird aus≡erdem folgende Zusatzfunktion verwendet
- equals - schaut, ob zwei Dreiecke gleich sind

**************************************************************************************
Anhang A: ANSI-Grafiken des Falles IIIa,IIIb,IIIc
**************************************************************************************
Glossary:
R = rechter Winkel
a = Quadrat/Rautenseite

Fall I

########################################
#R                                  ## #
#                                 ##   #
#                               ##     #
#                             ##       #
#                           ##         #
#                         ##           #
#                       ##             #
#                     ##               #
#                   ##R                #
#                 #####                #
#               ##  #  ##              #
#             ##    #    ##            #
#           ##      #      ##          #
#         ##        #        ##        #
#       ##          #          ##      #
#     ##            #            ##    #
#   ##              #              ##  #
# ##               R#R               ###
########################################

Fall IIa

                  ###
                ## # ##
              ##   #   ##
        a   ##     #     ##    a
          ##       #       ###
        ##         #          ##
      ##           #            ##
    ##             #              ##
  ##              R#R               ##
########################################
 ##               R#R                #
   ##              #              ###
     ##            #             #
       ##          #          ###
         ##        #         #
       a   ##      #      ###  a
             ##    #     #
               ##  #  ###
                 ### #
                   ##


Fall IIb

########################################
#R          ####                      R#
#           ##  #                      #
#          # #   #                     #
#         #  #    ##                   #
#         #  #      #                  #
#        #   #       #                 #
#       #    #        ##               #
#       #    #          #              #
#      #     #           #             # a
#     #      #            ##           #
#    #       #              #          #
#    #       #               ##        #
#   #        #                 #       #
#  #         #                  #      #
#  #         #                   ##    #
# #          #                     #   #
##           #                      #  #
##          R#R                      ###
########################################
		a

Fall IIc

                            ################################
                           ##     #                       #
                         ## ##    #                      #
                        #   ##    #                     #
                       #    ##    #                   ##
                     ##     ##    #                  #
                    #       # #   #                 #
                   #        # #   #                #
                  #         # #   #               #
                ##          # #   #              #
               #            #  #  #             #
              #             #  #  #           ##
             #              #  #  #          #  a
           ##               #   # #         #
          #                 #   # #        #
         #                  #   # #       #
       ##                   #   # #      #
      #                     #    ##     #
     #                      #    ##   ##
    #                       #    ##  #
  ##                        #    ## #
 #                          #     ##
###################################
               a



Fall  IIIa

########################################
#####                                 R#
# #  ###                               #
#  #    ###                            #
#   ##     ###                         #
#     #       ###                      #
#      #         ###                   #
#       #           ###                #
#        #             ###             #
#         #               ###          #
#          ##                ###       #
#            #                  ###    #
#             #                    ### #
#              #                      ##
#               #                   ####
#                ##             ####   #
#                  #        ####       #
#                   # R ####           #
#R                   ###              R#
########################################

Fall IIIb:

########################################
#####                                 ##
# #  ####                            # #
#  #     ###                        #  #
#   #       ###                    #   #
#    #         ####               #    #
#     #            ###           #     #
#      #              ###       #      #
#       #                ####R #       #
#        #                  R##        #
#         #                 ##         #
#          #               #           #
#           #             #            #
#            #           #             #
#             #         #              #
#              #       #               #
#               #     #                #
#                #   #                 #
#R                # #                 R#
########################################

Fall IIIc:

########################################
###                ## #               R#
#  ##             #    #               #
#    ##         ##      #              #
#      ##      #         #             #
#        ##R ##           #            #
#          ##R             #           #
#            ##             #          #
#              ##            #         #
#                ##          #         #
#                  ###        #        #
#                     ##       #       #
#                       ##      #      #
#                         ##     #     #
#                           ##    #    #
#                             ##   #   #
#                               ##  #  #
#                                 ## # #
#R                                  ####
########################################