AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Zwischen-den-Jahren-Kopfnuss: Hilfe zum Algorithmus
Thema durchsuchen
Ansicht
Themen-Optionen

Zwischen-den-Jahren-Kopfnuss: Hilfe zum Algorithmus

Ein Thema von Jazzman_Marburg · begonnen am 27. Dez 2011 · letzter Beitrag vom 31. Dez 2011
Antwort Antwort
Furtbichler
(Gast)

n/a Beiträge
 
#1

AW: Zwischen-den-Jahren-Kopfnuss: Hilfe zum Algorithmus

  Alt 28. Dez 2011, 08:11
Benachbarte Räume A und B haben ja eine gemeinsame Wand. Also ist
a) A.Xpos + A.Breite = B.Xpos (und A.Ypos + A.Höhe überschneidet sich mit B.Ypos + B.Höhe)
oder
b) A.Ypos + A.Höhe = B.Ypos (und A.Xpos + A.Breite überschneidet sich mit B.Xpos + B.Breite)

Damit kannst Du also eine Liste definieren als: A ist Nachbar von B.

für jeden Eintrag der Liste erzeugst Du eine Tür. Die kann ja nur am rechten oder unteren Rand des Rechteckes A sein.
Du musst nur noch die Mitte des sich überlappenden Bereiches finden. Das ist ja nicht so schwer, denn der überlappende Bereich, also die gemeinsame Wand ist die Schnittmenge der beiden rechten Wand von A mit der linken von B bzw. der unteren Wand von A mit der oberen von B.

Bei der Implementierung würdest du natürlich keine Liste erzeugen, sondern einfach so vorgehen:
Delphi-Quellcode:
For i:=0 to Rechteckliste.Count - 2 do
  For j:=i+1 to Rechteckliste.Count - 1 do
    If IstRechtsvon (RechteckListe[i], RechtEckListe[j]) then
       BaueTuerAnDerRechtenSeiteEin (RechteckListe[i], RechtEckListe[j])
    else if IstUnterhalbVon(RechteckListe[i], RechtEckListe[j]) then
       BaueTuerAnDerUnterenSeiteEin (RechteckListe[i], RechtEckListe[j])
...
Procedure BaueTuerAnDerRechtenSeiteEin (RechtEck A,B);
Begin
  GemeinsameWand := ErmittleUeberschneidung(A.RechteWand, B.LinkeWand);
  BaueTuerInDieMitte(GemeinsameWand);
End;
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#2

AW: Zwischen-den-Jahren-Kopfnuss: Hilfe zum Algorithmus

  Alt 28. Dez 2011, 08:40
Haben die Türen eine fixe Breite? Was wenn die Wand zwischen zwei Räumen kleiner ist?
Also so versetzte Räume quasi
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#3

AW: Zwischen-den-Jahren-Kopfnuss: Hilfe zum Algorithmus

  Alt 28. Dez 2011, 09:09
Liebe Leute, ihr seid wirklich klasse

So viele Ideen hätte ich wirklich nicht erwartet -- die Weihnachtsplätzchen haben euch offensichtlich nicht lahmgelegt.
Ich werde mir jetzt erstmal alle Vorschläge genauer anschauen und mal mit rumspielen.

Die Idee von stahli mit IntersectRect die Überschneidung von zwei Rechtecken (ähm. 'Räumen') zu prüfen sieht natürlich verlockend einfach aus.

Furtbichlers Vorschlag habe ich gestern Abend auch schon mal versucht -- vielversprechend, aber irgendwo habe ich da noch einen Fehler drin.

Haben die Türen eine fixe Breite? Was wenn die Wand zwischen zwei Räumen kleiner ist?
Also so versetzte Räume quasi
Ja, auch so ein kleines Nebenproblem: Die Türen sollten eine Mindestbreite haben, ja. Da soll später nämlich ein 'autonomer' Roboter durchfahren können. Das ist das Einsatzgebiet der generierten 'Wohnung'.

Selbstredend auch schönen Dank an Frederic und himitsu.

Lieben Dank für eure Mühe!

Schönen Gruß
Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#4

AW: Zwischen-den-Jahren-Kopfnuss: Hilfe zum Algorithmus

  Alt 28. Dez 2011, 09:11
Was wenn ein Raum nicht Rechteckig ist sondern rund, ne Schräge hat oder Aussparungen wie nen Giebel?
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.558 Beiträge
 
Delphi 12 Athens
 
#5

AW: Zwischen-den-Jahren-Kopfnuss: Hilfe zum Algorithmus

  Alt 28. Dez 2011, 09:16
'nen offener Kellerdurchbruch unter'm Teppich
eine Couch mitten im Zimmer
'ne Schrankwand steht mitten in einer Tür (war ja sonst nirgendwo Platz)
...
und wo ist die Eingangstür? (keiner kommt ein oder raus)
die Fenster für Frischluft wurden och vergessen



ach ja, die Dachschrägen sind egal, die Räume sind eh nur 12 cm hoch
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#6

AW: Zwischen-den-Jahren-Kopfnuss: Hilfe zum Algorithmus

  Alt 28. Dez 2011, 09:47
ich miente keine Dachschräge, nur die Form des Raumes, wenns quasi ein Dreieck wäre und ein anderer Raum an die schräge Wand anschliesst sollte da auch ne Tür hin.

Hindernisse sollte der Staubsauger selbst umfahren können.
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#7

AW: Zwischen-den-Jahren-Kopfnuss: Hilfe zum Algorithmus

  Alt 28. Dez 2011, 19:31
Hallo Leute,
wollte nur melden, dass sich stahlis Vorschlag mit IntersectRect als ziemlich wirksam erwiesen hat -- zumindest für meine einfache Rechteckswelt. Sehr elegant!

Vielen Dank an alle Beteiligten!

Gruß
Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 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