![]() |
Geometrie, Logik & Wohnen: Ein Verbindungsproblem
Liste der Anhänge anzeigen (Anzahl: 2)
Liebe Gemeinde!
Für ein Spiel generiere ich Grundrisse von Wohnungen mit verschieden vielen Räumen, die im gewissen Rahmen zufällig angeordnet sind. Nun möchte ich die einzelnen Räume mit Türen/Durchgängen verbinden (3 verschiedene Grundrisse Attachment 1). Fragt sich nur wie? Ich habe nach der Wohnungs-Generierung folgendes Array zur Hand:
Delphi-Quellcode:
D.h. im Array Wohnung finde ich zu jedem Raum seine Fläche, Höhe, Breite und die X- und Y-Koordinate für die obere linke Ecke des rechteckigen Raumes (brauchte ich ja auch für die Zeichnerei).
TRaum = RECORD
Flaeche : REAL; Hoehe : REAL; Breite : REAL; XOrigin : INTEGER; YOrigin : INTEGER; END; Wohnung: ARRAY OF TRaum; Nun konnte ich beim Zeichnen des Grundrisses aufgrund des Generierungs-Algorithums nicht einfach jede Wand z.B. in der Mitte mit eienem Durchgang versehen, da zu diesem Zeitpunkt nicht feststeht ob diese Wand nicht zufällig noch durch weitere Wände geteilt wird. D.h. ich gehe jetzt erstmal davon aus, dass ich nur mit dem Array of TRaum arbeiten muß. Hat irgendjemand eine Idee, wie man den Räumen mit diesen Angaben Durchgänge/Türen verpassen kann? Es ist nicht notwendig, dass die Tür in der Mitte der Wand ist -- hauptsache man kommt von einem Raum in alle benachbarten Räume (So solls aussehen Attachment2). Ist sicher nicht einfach -- aber wenn ihr eine Idee habt -- immer her damit! Vielen Dank & Gruß Jazzman |
Re: Geometrie, Logik & Wohnen: Ein Verbindungsproblem
Grundansatz:
Gehe das Array von vorne nach hinten durch und prüfe für jedes Element das noch weiter hinten liegt, ob die Räume benachbart sind. Wenn ja, baue eine Tür ein. In dem Bild aind immer Wände eingezeichnet - aber in dem Array finden die sich nicht wieder. Sind die Wände in den Raumkoordinaten schon mit drin, oder gibt es eine definierte Wanddicke? |
Re: Geometrie, Logik & Wohnen: Ein Verbindungsproblem
Hallo!
Zitat:
Zitat:
Delphi-Quellcode:
Danke & Gruß
MoveTo(XOrigin, YOrigin);
LineTo(Breite, YOrigin)); // horizontale Linie Jazzman |
Re: Geometrie, Logik & Wohnen: Ein Verbindungsproblem
Ich nochmal.
Zitat:
Tatsächlich sind die Wände nicht im Array enthalten. Die Wände muß man sich als Umriß um das Rechteck, was von der linken oberen Ecke (Wohnung[1].XOrigin, Wohnung[1].YOrigin) und der unteren rechten Ecke (Wohnung[1].Breite, Wohnung[1].Hoehe) des Raumes [1] vorstellen. Aber Dein Grundansatz, der im Prinzip verlockend aussieht, verwirrt noch etwas: Zitat:
Dankeschöön Jazzman |
Re: Geometrie, Logik & Wohnen: Ein Verbindungsproblem
Aber die Wanddicke ist doch konstant oder? Zumindest ist sie es in deinen Beispielen ;)
Wenn die Wanddicke bekannt ist, lassen sich benachbarte Räume finden, indem man Die Koordinaten vergleicht (Der Code ist etwas länglich, aber da kann man nicht viel machen) aber dabei muss man die Wanddicke mit berücksichtigen. Das läuft dann darauf hinaus, dann man jeweils gesondert prüft ob der Raum X über dem aktuellen ist, rechts davon, links davon oder darunter. Und das geht dann wiederum indem man (am Beispiel "rechts") prüft: X.Origin.x is between this.Origin.x and this.Origin.x + this.width + Wall and ( X.Origin.y is between this.Origin.y and this.Origin.y+this.height or this.Origin.y is between x.Origin.y and x.Origin.y+x.height ) Ist jetzt Pseudocode, aber die Idee sollte rüberkommen ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz