[PHP] koordinatengebiet umranden

flofly

New member
3 August 2006
2
0
Hallo,
ich habe folgendes Problem:

ich will ein Bild mit einem Raumplan erstellen. Ich bekomme die Koordinaten der "Raumkacheln" aus einer Datenbank und habe diese nun in einem Array gespeichert
Räume->[raumname]->[x][y]

nun will ich das ganze von PHP in einem Bild anzeigen lassen, dass es so aussieht: https://www.flofly.de/fileadmin/test.png

Mein Problem besteht nun bei der Umrandung der Räume, meine bisherige Methode ist einfach zu langsam.
Wie kann ich am besten alle Eckpunkte aus meinem Array für jeden Raum rausbekommen? (so das ich die Umrandung für jeden Raum am besten mit einem Polygon zeichnen kann)
Ich hab mir nun schon Ewigkeiten den Kopf zerbrochen aber komme auf keinen grünen Zweig.

Danke
Florian
 
Ich müsste deine Datenbankstruktur genau kennen.
Darf ich mir das so vorstellen, dass du mit "Raumkacheln" meinst:
(1,1)=>Raum 1
(2,1)=>Raum 1
(1,2)=>Raum 1
(3,1)=>leer
....
?
Wenn ja, lass das doch und speicher in der Datenbank gleich die Polygonpunkte, also z.B.
Raum 1 - (1,1)
Raum 1 - (8,1)
Raum 1 - (1,6)
Raum 1 - (8,6)
So hast du den Raum quadratisch von (1,1)-(8,6) abgesteckt und musst nur die Funktion imagepolygon() aufrufen.
 
ok,
vielleicht sollte ich mich deutlicher ausdrücken :p

die ganzen Wände sind mehr oder weniger beweglich, und die Räume müssen daher auch nicht unbedingt quadratisch sein (-> siehe Bild). Die Wände können aber nur entlang einer der ca 1mx1m breiten Kacheln gelegt werden. (ich habe das Bild nochmals etwas geändert, so dass man es besser sehen kann)
Es gibt also auch Kacheln, welche innerhalb eines Raumes liegen und keine Randlinie haben.

Die Datenbank ist mir leider vorgegeben. Das Format sie ungefähr so aus:
x y raum benutzer
1 1 8.33 Florian
1 2 8.33 Florian
2 1 8.33 Florian
2 2 Gang
2 3 Gang
.....


Danke
Florian
 
PHP:
for($y = 0; $y < $maxy; $y++) {
  for($x = 0; $x < $maxx; $x++) {
    // Feld darüber prüfen
    if(!isset($raumbelegung[($y-1)][$x]) OR $raumbelegung[($y-1)][$x] != $raumbelegung[$y][$x]) {
      zeichne_raumbegrenzungslinie_oberhalb_von($y, $x);
    }
    // Feld rechts prüfen
    if(!isset($raumbelegung[$y][($x+1)]) OR $raumbelegung[$y][($x+1)] != $raumbelegung[$y][$x]) {
      zeichne_raumbegrenzungslinie_rechts_von($y, $x);
    }
    // Feld darunter prüfen
    if(!isset($raumbelegung[($y+1)][$x]) OR $raumbelegung[($y+1)][$x] != $raumbelegung[$y][$x]) {
      zeichne_raumbegrenzungslinie_unterhalb_von($y, $x);
    }
    // Feld links prüfen
    if(!isset($raumbelegung[$y][($x-1)]) OR $raumbelegung[$y][($x-1)] != $raumbelegung[$y][$x]) {
      zeichne_raumbegrenzungslinie_links_von($y, $x);
    }
  }
}

Die zeichne_raumbegrenzungslinie_*_von($y, $x)-Funktionen müssen halt die genauen Pixelkoordinaten berechnen und an der entsprechenden Stelle eine Linie ziehen.
Ist sicherlich nicht die eleganteste Lösung, aber es müsste funktionieren.