Problem bei Bilderstellung für Sitzplan

max

Erfahrenes Mitglied
Ich habe folgende Aufgabe bekommen: Ich soll einen Sitzplan für einen Saal dynamisch erstellen. Das Ganze funktioniert so dass ich die Maße (in Metern) des Saales angebe und dann Flächen hinzufügen auf die keine Stühle kommen (via Koordinatensystem).

Für die Ganze Verarbeitung habe ich mir ein Koordinatensystem mit einem 2 dimensionalen Array zusammengebaut.

So ein Koordinatensystem sieht mit ein Paar nicht bestückten Flächen so aus:
Code:
1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 
1 1 0 2 2 2 2 2 0 1 1 0 2 2 2 2 2 0 1 1 
1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 
1 1 0 2 2 2 2 2 0 1 1 0 2 2 2 2 2 0 1 1 
1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 
1 1 0 2 2 2 2 2 0 1 1 0 2 2 2 2 2 0 1 1 
1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 
1 1 0 2 2 2 2 2 0 1 1 0 2 2 2 2 2 0 1 1 
1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 
1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 
1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 
1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 
1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 
1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 
1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 
1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 
1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1
bzw. sieht das Array so aus:
Code:
array(20) {
  [0]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(0)
    [6]=>
    int(0)
    [7]=>
    int(0)
    [8]=>
    int(0)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(0)
    [12]=>
    int(0)
    [13]=>
    int(0)
    [14]=>
    int(0)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [1]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(0)
    [6]=>
    int(0)
    [7]=>
    int(0)
    [8]=>
    int(0)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(0)
    [12]=>
    int(0)
    [13]=>
    int(0)
    [14]=>
    int(0)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [2]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(0)
    [6]=>
    int(0)
    [7]=>
    int(0)
    [8]=>
    int(0)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(0)
    [12]=>
    int(0)
    [13]=>
    int(0)
    [14]=>
    int(0)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [3]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(0)
    [6]=>
    int(0)
    [7]=>
    int(0)
    [8]=>
    int(0)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(0)
    [12]=>
    int(0)
    [13]=>
    int(0)
    [14]=>
    int(0)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [4]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(0)
    [6]=>
    int(0)
    [7]=>
    int(0)
    [8]=>
    int(0)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(0)
    [12]=>
    int(0)
    [13]=>
    int(0)
    [14]=>
    int(0)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [5]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(0)
    [6]=>
    int(0)
    [7]=>
    int(0)
    [8]=>
    int(0)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(0)
    [12]=>
    int(0)
    [13]=>
    int(0)
    [14]=>
    int(0)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [6]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(0)
    [6]=>
    int(0)
    [7]=>
    int(0)
    [8]=>
    int(0)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(0)
    [12]=>
    int(0)
    [13]=>
    int(0)
    [14]=>
    int(0)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [7]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(0)
    [6]=>
    int(0)
    [7]=>
    int(0)
    [8]=>
    int(0)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(0)
    [12]=>
    int(0)
    [13]=>
    int(0)
    [14]=>
    int(0)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [8]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(0)
    [6]=>
    int(0)
    [7]=>
    int(0)
    [8]=>
    int(0)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(0)
    [12]=>
    int(0)
    [13]=>
    int(0)
    [14]=>
    int(0)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [9]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(1)
    [3]=>
    int(1)
    [4]=>
    int(1)
    [5]=>
    int(1)
    [6]=>
    int(1)
    [7]=>
    int(1)
    [8]=>
    int(1)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(1)
    [12]=>
    int(1)
    [13]=>
    int(1)
    [14]=>
    int(1)
    [15]=>
    int(1)
    [16]=>
    int(1)
    [17]=>
    int(1)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [10]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(1)
    [3]=>
    int(1)
    [4]=>
    int(1)
    [5]=>
    int(1)
    [6]=>
    int(1)
    [7]=>
    int(1)
    [8]=>
    int(1)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(1)
    [12]=>
    int(1)
    [13]=>
    int(1)
    [14]=>
    int(1)
    [15]=>
    int(1)
    [16]=>
    int(1)
    [17]=>
    int(1)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [11]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(0)
    [6]=>
    int(0)
    [7]=>
    int(0)
    [8]=>
    int(0)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(0)
    [12]=>
    int(0)
    [13]=>
    int(0)
    [14]=>
    int(0)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [12]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(0)
    [6]=>
    int(0)
    [7]=>
    int(0)
    [8]=>
    int(0)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(0)
    [12]=>
    int(0)
    [13]=>
    int(0)
    [14]=>
    int(0)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [13]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(0)
    [6]=>
    int(0)
    [7]=>
    int(0)
    [8]=>
    int(0)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(0)
    [12]=>
    int(0)
    [13]=>
    int(0)
    [14]=>
    int(0)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [14]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(0)
    [6]=>
    int(0)
    [7]=>
    int(0)
    [8]=>
    int(0)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(0)
    [12]=>
    int(0)
    [13]=>
    int(0)
    [14]=>
    int(0)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [15]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(0)
    [6]=>
    int(0)
    [7]=>
    int(0)
    [8]=>
    int(0)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(0)
    [12]=>
    int(0)
    [13]=>
    int(0)
    [14]=>
    int(0)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [16]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(1)
    [6]=>
    int(1)
    [7]=>
    int(1)
    [8]=>
    int(1)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(1)
    [12]=>
    int(1)
    [13]=>
    int(1)
    [14]=>
    int(1)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [17]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(1)
    [6]=>
    int(1)
    [7]=>
    int(1)
    [8]=>
    int(1)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(1)
    [12]=>
    int(1)
    [13]=>
    int(1)
    [14]=>
    int(1)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [18]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(1)
    [6]=>
    int(1)
    [7]=>
    int(1)
    [8]=>
    int(1)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(1)
    [12]=>
    int(1)
    [13]=>
    int(1)
    [14]=>
    int(1)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
  [19]=>
  array(20) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
    [3]=>
    int(0)
    [4]=>
    int(0)
    [5]=>
    int(0)
    [6]=>
    int(0)
    [7]=>
    int(0)
    [8]=>
    int(0)
    [9]=>
    int(1)
    [10]=>
    int(1)
    [11]=>
    int(0)
    [12]=>
    int(0)
    [13]=>
    int(0)
    [14]=>
    int(0)
    [15]=>
    int(0)
    [16]=>
    int(0)
    [17]=>
    int(0)
    [18]=>
    int(1)
    [19]=>
    int(1)
  }
}
1 … sind geschützte Flächen wie Gänge, Technikbereich usw.
0 … sind Freie Flächen
2 … sind Stühle

Um das ganze zu Bestuhlen durchgehe ich das Array und prüfe ob ein Stuhl Platz hat (also ob kein geschützter Bereich in die Fläche des Stuhls ragt), falls ja wird ein Stuhl gesetzt.

Das funktioniert auch alles wunderbar nur will ich aus dem Ganzen jetzt eine Grafik erstellen und da habe ich ein paar Probleme.

Zum Erstellen der Grafik berechne ich mir durch die Ausmaße der Grafik und des eigentlichen Raumes welche Größe die Rasterfelder haben (zB. 10 x 10 px).

Jetzt durchgehe ich das Array mit einer foreach Schleife und frage jeden Rasterpunkt ab welchen wert er hat und erzeuge dementsprechend ein Rechteck in der entsprechenden Farbe.

Mein Problem ist jetzt dass das Array mit dem Raster zwar vollständig ist, aber die Grafik wird je nach Größe des Raumes abgeschnitten, dh. es werden zB. nur 2 Rasterzeilen gezeichnet, komisch ist allerdings wenn ich mir die Werte in der Schleife ausgeben lasse sehe ich dass eigentlich das komplette Raster verarbeitet wird.


Ich komm irgendwie nicht auf die Lösung, würde mich sehr freuen wenn mir jemand Helfen könnte.



Meine Funktion zum Erstellen des Bildes:
PHP:
<?
    ///////////////////////////////////
    ////      Image Berechnen      ////
    function make_image() {
        $imgWidth = $this->IMAGE_CONFIG['width']; // Breite des Bildes zB. 400 Pixel
        $imgHeight = $this->IMAGE_CONFIG['height'];// Hoehe des Bildes zB. 600 Pixel
        
        $rWidth  = $this->IMAGE_CONFIG['raster_px_width'];  // Breite eines Rasterpunktes in Pixel
        $rHeight = $this->IMAGE_CONFIG['raster_px_height']; // Breite eines Rasterpunkte in Pixel
        
        $im = imagecreate($imgWidth, $imgHeight);
        
        foreach ($this->ROOM_RASTER as $keyLength => $valLength) {
            foreach ($this->ROOM_RASTER[$keyLength] as $keyWidth => $valWidth) {
                $curRasIndex = $valWidth; // wert des aktuellen Rasterpunktes zb. 1, 0 oder 2
                
                /*
                Array fuer Farben:
                $this->IMAGE_CONFIG['color_config'] = array (
                "0" => array( "name" => "white", "red" => 255, "green" => 255, "blue" => 255 ),
                "1" => array( "name" => "gray",  "red" => 159, "green" => 159, "blue" => 159 ),
                "2" => array( "name" => "green", "red" => 92,  "green" => 202, "blue" => 90 ),
                "3" => array( "name" => "red",   "red" => 250, "green" => 49,  "blue" => 49 ),
                );    
                */
                
                $curColor = imagecolorallocate($im, $this->IMAGE_CONFIG['color_config'][$curRasIndex]['red'], $this->IMAGE_CONFIG['color_config'][$curRasIndex]['green'], $this->IMAGE_CONFIG['color_config'][$curRasIndex]['blue']);
                
              #  echo "cur Val Y: $keyLength X: $keyWidth ";
                
                // Kooridinate fuer aktuellen Rasterbereich im Bild berechnen
                $x1 = $keyWidth  * $rWidth;  // zB. 1 x 10px = 10 horizontal
                $y1 = $keyLength * $rHeight; // zB. 1 x 10px = 10 vertikal
                
                $x2 = $x1 + $rWidth;
                $y2 = $y1 + $rHeight;                
                
               # echo "| Farbe: ".$this->IMAGE_CONFIG['color_config'][$curRasIndex]['name']." X1: $x1 Y1: $y1 X2: $x2 Y2: $y2 \n";
                
                imagefilledrectangle($im, $x1, $y1, $x2, $y2, $curColor); // Rechteck fuer aktuellen Rasterpunkt erstellen
            }
        }
        
        imagejpeg($im,'plan.jpg');
    }
    ///////////////////////////////////
?>
Das Bild sollte ca. so Aussehen (nur andere Maße):
shema.gif

Und so sieht das Bild aus dass generiert wird:
plan.jpg
 
Wenn ich mir dein Array anschaue, stehen da ja nur 0 und 1 drin, also kann das Array kein Problem darstellen.

Schaue ich mir aber das Bild an und die Anzahl der Arraywerte die dort durchgegangen werden, so könnte er genau bei 256 das Bild abschneiden.
Kannst du das irgendwie bestätigen, ab welchem Wert der das Bild abeschneidet?

Wenn das so ist, tippe ich auf irgendeinen Überlauf, was man da machen kann? Noch keine Gedanken gemacht ;)

Gruss
 
Ja du hast recht das Bild wird beim 256 Rasterpunkt abgebrochen.
Jetzt stellt sich mir eigentlich die Frage wieso er abbricht, wird es zu Speicherintensiv oder was kann es da sonst haben?
 
Zuletzt bearbeitet:
Einen genauen Grund finde ich nicht.
Ich tippe auf die Funktion imagefilledrectangle() die nicht mehr als 256 Rechtecke auf das Image legen kann. Aber google und konsorten geben keine Info darüber, ob es ein Limit gibt.
Vielleicht läuft auch der Speicher voll für das Script oder die Max Exec Time.

Kannst du das Script auf nem WebServer laufen lassen, wo du an den Einstellungen der php.ini was ändern kannst?

Wenn dann wären es die Werte "memory_limit" oder "max_execution_time". Das sind aber Vermutungen. Leider fällt mir derzeit nichts besseres ein.

Gruss
 
Das die "max_execution_time" überschritten wird bezweifle ich, da das ganze mit meinem Beispielraum (2 x 2 Meter) doch recht schnell geht.

Das "memory_limit" kann es auch nicht sein da ich es jetzt auf 64MB hochgeschraubt habe und das Bild wird immer noch nicht richtig gezeichnet.

Könnte ich das Rechteck vielleicht auf eine andere Art erstellen?
 
So jetzt hab ich das Problem durch ausprobieren gelöst.
Man muss anstatt imagecreate() imagecreatetruecolor verwenden dann geht es.

Das hatte ich auch schon beim schreiben der Funktion, aber dann hab ich mir gedacht das brauchst du eigentlich nicht und hab imagecreate() genommen, ich könnt gegen die Wand laufen :-(
 
Zuletzt bearbeitet:
Zurück