Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ws1617:optimales_puppenhaus [2017/04/23 11:57] workbench |
ws1617:optimales_puppenhaus [2017/04/24 11:52] (aktuell) workbench |
||
---|---|---|---|
Zeile 9: | Zeile 9: | ||
- | Unser Projekt „Optimales Puppenhaus“ hat die dreidimensionale Generierung eines Hauses gemäß den Anforderungen des Nutzers (Baugrundfläche etc.) und gewisser Optimalitätskriterien zum Ziel. Als optimal wird beispielsweise die Ausrichtung der Fenster für einen vorteilhaften Lichteinfall, die Verhältnisse der Raummaße gemäß des goldenen Schnittes, aber auch ganz banale Dinge wie die Position von Schränken mit einem ausreichenden Abstand zueinander, sodass der eine Schrank nicht die Öffnung der Tür des anderen behindert, angesehen. | + | Unser Projekt „Optimales Puppenhaus“ hat die dreidimensionale Generierung eines Hauses gemäß den Anforderungen des Nutzers (Baugrundfläche etc.) und gewisser Optimalitätskriterien zum Ziel. Als optimal wird beispielsweise die Ausrichtung der Fenster für einen vorteilhaften Lichteinfall, die Verhältnisse der Raummaße gemäß des goldenen Schnittes, aber auch ganz banale Dinge((Abandoned)) wie die Position von Schränken mit einem ausreichenden Abstand zueinander, sodass der eine Schrank nicht die Öffnung der Tür des anderen behindert, angesehen. |
Ziel des Projekts ist der 3D-Druck eines nach unseren Maßstäben optimalen kleinen Puppenhauses. | Ziel des Projekts ist der 3D-Druck eines nach unseren Maßstäben optimalen kleinen Puppenhauses. | ||
Zeile 20: | Zeile 20: | ||
=== Projektplanung === | === Projektplanung === | ||
- | In den ersten Wochen haben wir uns unterschiedliche Teilziele definiert, wovon sich aber die meisten als unrealistisch herausgestellt haben. Schlussendlich haben wir uns die drei dimensionale Visualisierung eines nach unterschiedlichen kriterien optimierten Raumes als Endziel gesetzt. Als Zwischenziele haben wir uns die einzelnen Objekte vorgenommen, aus welche ein Raum sich zusammensetzt. | + | In den ersten Wochen haben wir uns unterschiedliche Teilziele definiert, wovon sich aber die meisten als unrealistisch herausgestellt haben. Schlussendlich haben wir uns die drei dimensionale Visualisierung eines nach unterschiedlichen Kriterien optimierten Raumes als Endziel gesetzt. Als Zwischenziele haben wir uns die einzelnen Objekte vorgenommen, aus welche ein Raum sich zusammensetzt. |
- | Nach einigen Wochen haben wir unsere größere Gruppe von sechs Personen, in zwei Untergruppen aufgeteilt. Die Triangulisierungs-Gruppe war verantwortlich für die Konvertion eines generierten 3D-Objektes, in ein geometrisch vergleichbares Objekt, bestehend ausschließlich aus der Zusammensetzung flacher Dreiecke. Dadurch werden überflüssige Trennwände entfernt, wodurch es möglich wird das Objekt mittels eines 3D-Druckers auszudrucken. | + | Nach einigen Wochen haben wir unsere größere Gruppe von sechs Personen, in zwei Untergruppen aufgeteilt. Die Triangulierungs-Gruppe war verantwortlich für die Konvertion eines generierten 3D-Objektes, in ein geometrisch vergleichbares Objekt, bestehend ausschließlich aus der Zusammensetzung flacher Dreiecke. Dadurch werden überflüssige Trennwände entfernt, wodurch es möglich wird das Objekt mittels eines 3D-Druckers auszudrucken. |
- | Die andere Gruppe ist Verantwortlich für die Visualisierung und den Optimierungs-Algorithmus. Die Visualisierung besteht aus einer 3-Dimensionalen Darstellung der Wände welches mittels dem Modul "Vpython" ermöglicht wird. Der Optimierungs-Algorithmus soll die Maße eines Raumes unter dem Einfluss unterschiedlicher Bedingungen und Einschränkungen berechnen. Für die Optimierung benutzen wird die "fmin_cobyla" Funktion aus der "scipy.optimize" bibliothek. Für weitere mathematsiche Operationen benutzen wir das Modul "numpy". | + | Die andere Gruppe ist Verantwortlich für die Visualisierung und den Optimierungs-Algorithmus. Die Visualisierung besteht aus einer 3-Dimensionalen Darstellung der Wände welches mittels dem Modul "Vpython" ermöglicht wird. Der Optimierungs-Algorithmus soll die Maße eines Raumes unter dem Einfluss unterschiedlicher Bedingungen und Einschränkungen berechnen. Für die Optimierung benutzen wird die "fmin_cobyla" Funktion aus der "scipy.optimize" Bibliothek. Für weitere mathematsiche Operationen benutzen wir das Modul "numpy". |
=== Projektverlauf === | === Projektverlauf === | ||
- | == Visualisierung == | + | __**Visualisierung**__ |
Um einen Raum 3-Dimensional darzustellen, haben wir die einzelnen Bestandteile eines Raumen in unabhängige Objekte eingeteilt. Das einfachste Objekt ist das "Wall-Objekt" aus dem kompliziertere Objekte wie das "Fensterwand-Objekt" und das "Türwand-Objekt" zusammengesetzt werden. | Um einen Raum 3-Dimensional darzustellen, haben wir die einzelnen Bestandteile eines Raumen in unabhängige Objekte eingeteilt. Das einfachste Objekt ist das "Wall-Objekt" aus dem kompliziertere Objekte wie das "Fensterwand-Objekt" und das "Türwand-Objekt" zusammengesetzt werden. | ||
- | __Wall-Objekt__ | + | __**Wall-Objekt**__ |
<code python> | <code python> | ||
Zeile 97: | Zeile 97: | ||
</code> | </code> | ||
- | Ein Wall-Objekt ist im Prinzip nichts anderes als ein flacher Quader, welche sich die Koordinaten seiner acht Eckpunkte merkt. Beim initieren eines Wall-Objektes muss ein Mittelpunkt, eine Achse und eine Länge der Wand angegeben werden. Mithilfe dieser Informationen können die entsprechenden Eckpunkte ausgerechnet werden. Darüberhinaus besitzt jedes Wall-Objekt auch noch die Methoden push(), rotate() und getPoints(). Die push() und rotate() Methoden bewegen das Objekt im Raum und berechnet die neue Positionen der Eckpunkte. Dadurch ist sich jedes Wall-Objekt seinen eigenen Punkten zu jeder Zeit und in jeder Position bewusst. Die getPoints() Methode erlaubte uns die Koordinaten jeder der Eckpunkte abzurufen. | + | Ein Wall-Objekt ist im Prinzip nichts anderes als ein flacher Quader, welche sich die Koordinaten seiner acht Eckpunkte merkt. Beim initiieren eines Wall-Objektes muss ein Mittelpunkt, eine Achse und eine Länge der Wand angegeben werden. Mithilfe dieser Informationen können die entsprechenden Eckpunkte ausgerechnet werden. Darüberhinaus besitzt jedes Wall-Objekt auch noch die Methoden push(), rotate() und getPoints(). Die push() und rotate() Methoden bewegen das Objekt im Raum und berechnet die neue Positionen der Eckpunkte. Dadurch ist sich jedes Wall-Objekt seinen eigenen Punkten zu jeder Zeit und in jeder Position bewusst. Die getPoints() Methode erlaubte uns die Koordinaten jeder der Eckpunkte abzurufen. |
- | __Tuerwand-Objekt__ | + | __**Tuerwand-Objekt**__ |
<code python> | <code python> | ||
from __future__ import division | from __future__ import division | ||
Zeile 178: | Zeile 178: | ||
Die methode structure_wall() ist verantwortlich für das kreeiren der einzelnen Wände in den korrekten Positionen und setzt das gesamte Tuerwand-Objekt zusammen. | Die methode structure_wall() ist verantwortlich für das kreeiren der einzelnen Wände in den korrekten Positionen und setzt das gesamte Tuerwand-Objekt zusammen. | ||
- | __Fenster-Objekt__ | + | __**Fenster-Objekt**__ |
<code python> | <code python> | ||
from __future__ import division | from __future__ import division | ||
Zeile 276: | Zeile 276: | ||
</code> | </code> | ||
- | Ähnlich wie bei dem Tuerwand-Objekt, wird das Fensterwand-Objekt aus 4 unterschiedlichen Wall-Objekten zusammengesetzt. Beim inizieeren eines Tuerwand-Objektes muss die Länge, Position und die Achse angegeben werden. Optional kann auch noch die Größe des Fensters wie auch seine Position mittel des ratio-Parameters angepasst werden. | + | Ähnlich wie bei dem Tuerwand-Objekt, wird das Fensterwand-Objekt aus 4 unterschiedlichen Wall-Objekten zusammengesetzt. Beim initiieren eines Tuerwand-Objektes muss die Länge, Position und die Achse angegeben werden. Optional kann auch noch die Größe des Fensters wie auch seine Position mittel des ratio-Parameters angepasst werden. |
- | __Raum-Objekt__ | + | __**Raum-Objekt**__ |
<code python> | <code python> | ||
Zeile 393: | Zeile 393: | ||
</code> | </code> | ||
- | Nachdem die Grundbausteine eines Raumes etabliert sind, werden sie im Raum-Objekt zusammengefasst. Beim initieeren eines Raum-Objekts muss eine x-Länge des Raumes, eine y-Länge des Raumes und jeweils eine Angabe welche Wand ein Tüerwand-Objekt sein soll bzw. ein Fensterwand-Objekt. Die structure_room() Methode kreeirt die jeweiligen Objekt-Bausteine in den entsprechenden Positionen. | + | Nachdem die Grundbausteine eines Raumes etabliert sind, werden sie im Raum-Objekt zusammengefasst. Beim initiieren eines Raum-Objekts muss eine x-Länge des Raumes, eine y-Länge des Raumes und jeweils eine Angabe welche Wand ein Tüerwand-Objekt sein soll bzw. ein Fensterwand-Objekt. Die structure_room() Methode kreeirt die jeweiligen Objekt-Bausteine in den entsprechenden Positionen. |
Die Wall.getPoints() Methode dient als Schnittstelle zwischen der Visualisierungs Gruppe und der Triangulisierungs Gruppe. | Die Wall.getPoints() Methode dient als Schnittstelle zwischen der Visualisierungs Gruppe und der Triangulisierungs Gruppe. | ||
- | __Main-Visualisierung__ | + | __**Main-Visualisierung**__ |
- | Nachdem wir uns auf ein Layout für die Grundrisse der Wohnung geeinigt haben, bemerkten wir schnell das unsere ursprüngliche Idee jeden einzelnen Raum als eigenes Raum-Objekt zu initieeren, ineffizient und unpraktisch war. Angenommen alle 5 Räume (4 Räume + Gang) würden als eigene Raum-Objekte passend im Koordinatensystem nebeneinander initialisiert werden, so würde in bestimmten Fällen mehr als eine Wand die selben Räume trennen, wodurch Wände unnötig überlappen. Deshalb entschieden wir uns den Raum aus den einzelnen Raum-Bausteinen zusammenzusetzen. So besteht ein Raum mit zwei Fenstern und einer Tür aus zwei Fensterwand-Objekte, ein Tuerwand-Objekt und ein Wall-Objekt. | + | Nachdem wir uns auf ein Layout für die Grundrisse der Wohnung geeinigt haben, bemerkten wir schnell das unsere ursprüngliche Idee jeden einzelnen Raum als eigenes Raum-Objekt zu initiieren, ineffizient und unpraktisch war. Angenommen alle 5 Räume (4 Räume + Gang) würden als eigene Raum-Objekte passend im Koordinatensystem nebeneinander initialisiert werden, so würde in bestimmten Fällen mehr als eine Wand die selben Räume trennen, wodurch Wände unnötig überlappen. Deshalb entschieden wir uns den Raum aus den einzelnen Raum-Bausteinen zusammenzusetzen. So besteht ein Raum mit zwei Fenstern und einer Tür aus zwei Fensterwand-Objekte, ein Tuerwand-Objekt und ein Wall-Objekt. |
Die getStructure() Funktion, ruft mithilfe eine Moduls namens "subprocesses32" den Algorithmus auf (siehe unten) welche eine Datenstruktur liefert, in der die optimierten Maße der Wohnung gespeichert sind. Diese wird anschließend ausgelesen in der structureBuilding Funktion und die einzelnen Wände werden entsprechend initialisiert. | Die getStructure() Funktion, ruft mithilfe eine Moduls namens "subprocesses32" den Algorithmus auf (siehe unten) welche eine Datenstruktur liefert, in der die optimierten Maße der Wohnung gespeichert sind. Diese wird anschließend ausgelesen in der structureBuilding Funktion und die einzelnen Wände werden entsprechend initialisiert. | ||
Zeile 500: | Zeile 500: | ||
Wall.standard_wall_thickness = z_len + 0.2 | Wall.standard_wall_thickness = z_len + 0.2 | ||
- | boden_pos = (mp[0], -0.1, mp[2]) | + | boden_pos = (mp[0], -0.1, mp[2]) |
- | sphere(pos=mp,radius=0.1,color=color.green) | + | |
- | sphere(pos=boden_pos,radius=0.1,color=color.red) | + | |
- | + | ||
boden = Wall(position=boden_pos, ax=(1,0,0), length=x_len + 0.2) | boden = Wall(position=boden_pos, ax=(1,0,0), length=x_len + 0.2) | ||
Wall.standard_wall_height = 3.0 | Wall.standard_wall_height = 3.0 | ||
Wall.standard_wall_thickness = 0.2 | Wall.standard_wall_thickness = 0.2 | ||
- | |||
- | arrow(pos=(0,0,0), axis=(0,0,5), shaftwidth=0.1) # z Axis | ||
- | sphere(radius=0.1, pos=(0,0,0), color=color.red) | ||
- | label(pos=(2,0,0), text="x Axis") | ||
- | arrow(pos=(0,0,0), axis=(10,0,0), shaftwidth=0.1, color=color.red) # x Axis | ||
- | label(pos=(0,0,2), text="z Axis") | ||
StructureBuilding(ast.literal_eval(getStructure())) | StructureBuilding(ast.literal_eval(getStructure())) | ||
Zeile 669: | Zeile 660: | ||
</code> | </code> | ||
- | __Endergebniss__ | + | __**Endergebniss**__ |
Ruft man die Datei "main.py" in dem Visualisierungs Algorithmus auf, so erhält man eine Optimierte Visualisierung des Grundrisses. | Ruft man die Datei "main.py" in dem Visualisierungs Algorithmus auf, so erhält man eine Optimierte Visualisierung des Grundrisses. | ||