Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Geometrie, Logik & Wohnen: Ein Verbindungsproblem (https://www.delphipraxis.net/147950-geometrie-logik-wohnen-ein-verbindungsproblem.html)

Jazzman_Marburg 19. Feb 2010 15:13


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:
TRaum = RECORD
  Flaeche : REAL;
  Hoehe  : REAL;
  Breite : REAL;
  XOrigin : INTEGER;
  YOrigin : INTEGER;
END;

Wohnung: ARRAY OF TRaum;
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).
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

jfheins 19. Feb 2010 15:23

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?

Jazzman_Marburg 19. Feb 2010 15:43

Re: Geometrie, Logik & Wohnen: Ein Verbindungsproblem
 
Hallo!

Zitat:

Zitat von jfheins
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.

Muß ich nochmal drüber nachdenken. :gruebel:

Zitat:

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?
Die Wanddicke ist beliebig. In der Generierungs-Routine zeichne ich einfach eine Linie mit:

Delphi-Quellcode:
MoveTo(XOrigin, YOrigin);
LineTo(Breite, YOrigin)); // horizontale Linie
Danke & Gruß
Jazzman

Jazzman_Marburg 19. Feb 2010 18:25

Re: Geometrie, Logik & Wohnen: Ein Verbindungsproblem
 
Ich nochmal.

Zitat:

Zitat von jfheins
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?

Jetzt habe ich die Nachfrage verstanden:
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:

Zitat von jfheins
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.

Wie erkenne ich, das Räume benachbart sind?

Dankeschöön
Jazzman

jfheins 19. Feb 2010 18:35

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 02:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz