Datentypen STL-Textdateien mit Java auslesen und größten Wert bestimmen

niklas_meyer

Mitglied
Guten Tag Forumsmitglieder

Leider stehe ich bei der Aufgabe voll auf dem Schlauch und bitte um Hilfe nicht um eine Lösung nur um einen Ansatz.
Ich kopier mal die Aufgabenstellung einfach:

Ihr Programm soll folgende Werte bestimmen:

• Das Dreieck mit der maximalen Entfernung jeweils seiner x-, y-, und z-Werte vom Nullpunkt. Für jedes Dreieck müssen Sie dafür zunächst den x-Wert (bzw. y- und z-Wert) bestimmen, der (absolut) am größten ist.

Für alle Dreiecke müssen Sie dann jeweils das Dreieck bestimmen, bei dem es die maximalen Abstände in Bezug auf die drei Richtungen x, y und z gibt. Sie müssen die Zeilennummern ausgeben (jeweils die erste Zeile der Dreieck-Definition), in denen das jeweilige Dreieck definiert wird.

• Alle Dreiecke, deren Normalenvektor senkrecht auf der x-z-Ebene des dreidimensionalen Koordinatensystems steht. Der Normalenvektor soll also in die (entweder positive oder negative) y-Richtung zeigen. Von diesen Dreiecken soll das Dreieck mit dem größten Flächeninhalt ermittelt werden. Dieser Flächeninhalt und die Zeile, in dem dieses Dreieck definiert wird, sollen dann ausgegeben werden.

Und dazu jetzt noch ein Auszug aus der STL-Textdatei damit man weiß wie es aussieht:

Es gibt zwei Sorten STL: Binäre und Textdateien. Letztere Dateien sind recht einfach aufgebaut: sie bestehen hauptsächlich aus dreidimensionalen Koordinaten von Dreieckpunkten (Vertices, Einzahl „Vertex“), die zusammengenommen die Oberfläche des Körpers beschreiben. Außerdem wird jedes Dreieck durch einen Normalenvektor („normal“) ergänzt, der die Richtung des Körperinneren beschreibt.
Ein Ausschnitt aus einer STL-Datei kann z. B so aussehen:

Code:
facet normal -0.000000e+00 -0.000000e+00 -1.000000e+00
    outer loop
      vertex   0.000000e+00 2.000000e+01 0.000000e+00
      vertex   0.000000e+00 0.000000e+00 0.000000e+00
      vertex   -6.585845e+01 2.000000e+01 0.000000e+00
    endloop
  endfacet
  facet normal 0.000000e+00 0.000000e+00 -1.000000e+00
    outer loop
      vertex   -6.585845e+01 2.000000e+01 0.000000e+00
      vertex   0.000000e+00 0.000000e+00 0.000000e+00
      vertex   -6.585845e+01 0.000000e+00 0.000000e+00
    endloop
  endfacet
  facet normal -4.064440e-01 0.000000e+00 -9.136757e-01
    outer loop
      vertex   -7.370995e+01 0.000000e+00 1.914540e+00
      vertex   -7.370995e+01 2.000000e+01 1.914540e+00
      vertex   -7.184737e+01 0.000000e+00 1.085978e+00
    endloop
  endfacet
  facet normal -4.064440e-01 0.000000e+00 -9.136757e-01
    outer loop
      vertex   -7.184737e+01 0.000000e+00 1.085978e+00
      vertex   -7.370995e+01 2.000000e+01 1.914540e+00
      vertex   -7.184737e+01 2.000000e+01 1.085978e+00
    endloop
  endfacet
  facet normal -2.945364e-01 0.000000e+00 -9.556403e-01
    outer loop
      vertex   -7.184737e+01 0.000000e+00 1.085978e+00
      vertex   -7.184737e+01 2.000000e+01 1.085978e+00
      vertex   -6.989923e+01 0.000000e+00 4.855459e-01
    endloop
  endfacet
 
Zuletzt bearbeitet von einem Moderator:

LimDul

Top Contributor
Schritt 1: Algorithmus überlegen. Was will ich eigentlich tun? Die Aufgabenstellung sagt (etwas umformuliert). Suche mir die Dreiecke aus der Eingabe, die gewissen Bedingungen genügen => Ergibt als Pseudo-Code auf einer sehr High-Level Ebene
Code:
* Lese alle Dreiecke aus der Eingabedatei
* Für jedes Dreieck, prüfe ob es den Bedingungen der Aufgabenstellung genügt
* Gibt die jeweiligen Dreiecke aus

Jetzt kann man anfangen die Schritte separat zu betrachten. Dreiecke aus der Eingabedatei lesen, was muss ich da tun? Wie ist ein Dreieck in der Eingabedatei definiert? Wie funktioniert ein einlesen einer Textdatei in Java am einfachsten?

* Das einfachste ist zeilenbasiert zu lesen, dann schauen wir doch mal in die Datei, wie so ein Dreeick definier ist. Beispiel:
Code:
facet normal -2.945364e-01 0.000000e+00 -9.556403e-01
outer loop
vertex -7.184737e+01 0.000000e+00 1.085978e+00
vertex -7.184737e+01 2.000000e+01 1.085978e+00
vertex -6.989923e+01 0.000000e+00 4.855459e-01
endloop
endfacet
Daraus kann man jetzt folgende Informationen entnehmen:
* Wenn ich Zeilenweise lese, weiß ich das ein Dreieck kommt, wenn die Zeile mit "facet " beginnt
* Wenn bei endfacet angekommen bin, hab ich ein Dreieck fertig gelesen
* Die Eckpunkte eines Dreiecks stehen in den Zeilen mit vertex und bestehen aus drei Koordinaten in wissenschaftlicher Notation
* Zusatzlich hab ich noch den Normvektor in der Zeile der mit facet stehen

Das heißt, der Algorithmus sieht im Pseudo-Code so aus
Code:
* Gehe Zeilweise durch die Datei
* Wenn die Zeile mit "facet " anfängt, lege ein neues Dreieck-Objekt an und speicher den Normvektor in dem Dreieck
* Wenn die Zeile mit vertex beginnt, füge in das zuletzt angelegte Dreieck Objekt einen Eckpunkt hinzu
* Wenn die Zeile mit endfacet beginnt, "speichere" das Dreieck in der Liste der fertigen Dreiecke

Der nächste Schritt wäre jetzt Dreieck-Objekte zu definieren, welche Attribute haben die. Und dann immer weiter so, dann kann man geometrische Operationen auf den Dreieck-Objekten definieren, wie .zB. den Abstand zum Nullpunkt. Wichtig ist dabei

* Jeden Schritt einzelnen testen. Sprich:
** Klappt das parsen einer Zeile
** Klappt das speichern in einem Dreieck Objekt
** Berechnen die geomtrischen Funktionen die richtigen Werte

Dadurch das man das alles separat macht, kann man es auch separat testen. So solltest zum testen der Funktionen wie z.B. den Abstand von Nullpnkt in deinen Tests die Dreieck Objekte im Test direkt anlegen und nicht aus einer STL Datei lesen. Und da halt mit einfachen Dreiecken (wo z.B. eine Ecke der Nullpunkt ist) starten hin zu komplexeren
 

Neue Themen


Oben