Algorithmus für einen zufälligen Raum, der von Elementen gleicher Länge begrenzt wird

8

Ich bin ein Architekturstudent, der versucht, ein räumliches Problem mit C # in Grasshopper for Rhino zu lösen.

Der Raum, den ich zu schaffen versuche, ist ein Ausstellungsraum in einem Flughafen. Der Raum besteht aus Elementen ähnlicher Länge. Die Idee besteht darin, sie mit einem Scharnier zu verbinden und ihnen so zu ermöglichen, Räume mit unterschiedlichem Layout und Größe zu schaffen, je nachdem wie viele Elemente verwendet werden.

Wie Sie aus der Illustration sehen können, möchte ich, dass der Raum mit einer Öffnung endet, die eine Elementlänge vom Ausgangspunkt entfernt ist.

Mein erster Versuch bestand darin, je nach Anzahl der benötigten Segmente (Wände) gleichseitige Dreiecke zu erzeugen. Kurz gesagt, vom Startpunkt aus werden Dreiecke erstellt, und dann werden die Seiten des Dreiecks, die den äußeren Rahmen bilden, zu einer Liste von Punkten hinzugefügt. Diese Punktliste wird an die Grasshopper-Anwendung zurückgegeben, die Linien zwischen den Punkten zeichnet. Ein kleiner Punkt ist, dass ich die Erstellung des nächsten Dreiecks entweder von der Seite AC oder BC aus dem letzten Dreieck zufällig gemacht habe.

Hier ist ein Beispiel für die erstellten Räume (für 12 - 8 - 14 - 20 Elemente):

Hier ist der Quellcode, der diese Punktlisten erstellt:

%Vor%

Was ich gerne tun würde, ist, die Gestaltung dieser Formen zu variieren, so dass sie nicht nur Korridore sind, sondern meinen ersten Skizzen ähneln. Ich möchte, dass ein Algorithmus eine Eingabe von Segmenten (Anzahl und Länge) vornimmt und dann verschiedene Raumlayouts vorschlägt, die mit dieser Anzahl von Segmenten erstellt werden können. Ich denke, wegen der Tesselation müsste der Raum mit Dreiecken, Quadraten oder Sechsecken erstellt werden? Denkst du, ich sollte in diesen "Maximum Area" -Algorithmus schauen: Ein beliebiges Gebiet mit Kreisen gleichen Radius hier auf stackoverflow abdecken ?

Ich würde jede Hilfe bei diesem Algorithmus sehr begrüßen. Prost, Eirik

    
Eirik 11.12.2010, 13:56
quelle

1 Antwort

1

Wenn Sie nur daran interessiert sind, ein Programm zu generieren, das extern evaluiert werden soll (und nicht alle derartigen Instanzen), können Sie Ihre Kurve "aufblasen". Zum Beispiel in der 14-Segment-Instanz in Ihrem zweiten Bild, gibt es eine Stelle, an der die Kurve nach innen geht und doppelt zurück - so hat Ihre Liste von Punkten einen Punkt wiederholt. Für Kurven wie diese könnten Sie alles zwischen den zwei (identischen) Punkten (A und B) sowie einem der umgebenden Punkte (A oder B) ausschneiden und einige Punkte zurückgewinnen, um Ihre Kurve zu erweitern - was möglicherweise zu eine Nicht-Korridor-Struktur. Sie müssen möglicherweise etwas Magie arbeiten, um sicherzustellen, dass es sich um eine "geschlossene" Kurve handelt, kaufen Sie jedoch abwechselnd Segmente an der Vorder- und Rückseite der Kurve.

Eine weitere Möglichkeit: Wenn Sie das Innere der Kurve identifizieren können (und es gibt Algorithmen dafür), dann können Sie, wenn zwei Segmente einen konkaven Winkel in Bezug auf Ihre Kurve bilden, diese ausblasen, um einen nicht-korridorischen Bereich zu erstellen. Z.B. Das zweite und dritte Segment Ihrer 14-Segment-Kurve oben könnte nach links ausgeblasen werden.

Wenn Sie diese beiden Methoden nacheinander auf Ihre korridorähnliche Kurve anwenden, sollten viele der von Ihnen gewünschten Formen generiert werden. Viel Glück!

    
John Umbaugh 12.12.2010 03:27
quelle

Tags und Links