Bereiche auf einer Karte mittels x y Position zufällig verteilen

Blobb

Mitglied
Hallo,

.. ich bin gerade auf ein Problem gestossen an dem ich nicht weiter komme.
Hoffe kann mir jemand helfen.

Ich muss auf einer Fläche von 550x250 px eine gewisse Anzahl (mind. 75 - max. 150) von Punkte(Kreise) zufällig verteilen die 13x13px gross sind.
Diese Punkte,welche später mit einem Link versehen werden müssen, dürfen sich nicht überschneiden und sollten einen mindestabstand von 13 px haben.

Wie verteile ich nun diese Positionen, so das alles schön durcheinander ist aber sich nicht überschneidet?

Könnte ja über eine for Schleife x Position um je 13px erhöhen und dann y zufällig eine Position vergeben zwischen 13 und 517px.
Dann würden diese Punkte zwar was y angeht unterschiedlich verteilt sein.
Aber es würde alles so geordnet aussehn da ja alles in einer x Reihe steht. Mehr oder weniger.

Hoffe ist verständlich was ich meine :)
 
Hi,

du generierst immer einen y,x Wert.
Dann malst du den Preis auf das Bild. Dann machste $y2=$y+13 und $x2=$x+13.
Dann mit einer for Schleife alle Werte zwischen $y und $y2 / $x und $x2 in ein Array eintragen. Bei jeder neuen x und y Generation überpfüst du in der For-Schleife, ob die Koordinaten im Array sind. Wenn ja, dann werden neuen Koords generiert usw.

So würde ich es machen... :suspekt:

mfg
dmx
 
Sorry, aber das versteh ich irgendwie nicht.

Welche x,y Zahlen soll ich denn generieren?
1,2,3.... fortlaufende oder zufällige oder oder. .. ?

Dann, wie soll die Schleife aussehen die zwischen 3 Werten Zahlen in ein Array gibt?

Du meintest zwischen: $y und $y2/$x und $x2
Angenommen $y = 10 und $x = 10.
Dann müßte ich Zahlen in ein Array lesen, die zwischen 10 und 2,3 und 23 liegen ?
Kapier ich nicht :)
 
PHP:
$anzahlPunkte=150;

$x=rand(1,550);
$y=rand(1,250);

$x2=$x+13;
$y2=$y+13;

$xK=array();
$yK=array();

for($c=1;$c<=$anzahlPunkte;$c++)
{

    while(in_array($x,$xK) || in_array($x2,$xK))
    {
		$x=rand(1,550);
		$x2=$x+13;
    }
    
    while(in_array($y,$yK) || in_array($y2,$yK))
    {
		$y=rand(1,250);
		$y2=$y+13;
    }
	
	//kreis aufzeichnen mit $x und $y
	
    for($i=1;$i<=13;$i++)
    {
        $xK[]=$x;
        $yK[]=$y;
        $x++;
        $y++;
    }

}

Das könnte gehen... ist ungetestet, einfach so mal schnell hingeschrieben. ;-]
Hoffe versteht den Code besser als den Text. :p

mfg
dmx
 
Zuletzt bearbeitet:
Also ich hab den Thread nur mal so überflogen. :)
Das mit den Überschneiden ist eingentlich kein Problem, du speicherst alle schon generierten Punkte in ein Array und überprüfst bei jedem neuen ob irgend ein zuvor gesetzter Punkt nicht ähnline Koordinaten hat.
 
XEMO hat gesagt.:
Also ich hab den Thread nur mal so überflogen. :)
Das mit den Überschneiden ist eingentlich kein Problem, du speicherst alle schon generierten Punkte in ein Array und überprüfst bei jedem neuen ob irgend ein zuvor gesetzter Punkt nicht ähnline Koordinaten hat.

Neee, ne? :rolleyes:
wenn die Lösung schon mit Text und Code da steht, ist es leicht sowas loszuwerden. ;-]

mfg
dmx
 
Also ich hab das mal so übernommen.

Wenn ich

PHP:
$x=rand(1,550);
$y=rand(1,250);

$x2=$x+13;
$y2=$y+13;

$xK=array();
$yK=array();

nicht innerhalb der for schleife setze, passiert garnix.
Tue ich es doch, überschneiden sich die Werte.
 
Jo stimmt,

so sollte es aussehen:

PHP:
$anzahlPunkte=150; 

$xK=array(); 
$yK=array(); 

for($c=1;$c<=$anzahlPunkte;$c++) 
{
	$x=rand(1,550); 
    $y=rand(1,250); 

    $x2=$x+13; 
    $y2=$y+13; 
....

Wenn du $xK und $yK in die Schleife packst, werden immer die schon eingefügten Punkte gelöscht und dann ist jeder Punkt richtig.

mfg
dmx
 
Jetzt erhalte ich einen 500er Fehler

Edit:

So sieht das Script momentan aus:

PHP:
header('content-type: image/jpeg');

$basis        = "bg.jpg";
$bild1        = "p.jpg";

$anzahlPunkte = 100;
$width        = 14;
$height       = 14;

$punkt        = imagecreatefromjpeg($bild1);
$image        = imagecreatefromjpeg($basis);
$size         = getimagesize($basis);

for($c=1;$c<=$anzahlPunkte;$c++)
{
 $x   = rand(1,670);
 $y   = rand(1,210);
 
 $x2  = $x+$width;
 $y2  = $y+$height;
 
 $xK  = array();
 $yK  = array();

 while(in_array($x,$xK) || in_array($x2,$xK))
 {
  $x  = rand(1,670);
  $x2 = $x+$width;
 }
 while(in_array($y,$yK) || in_array($y2,$yK))
 {
  $y  = rand(1,210);
  $y2 = $y+$height;
 }
 //kreis aufzeichnen mit $x und $y
 for($i=1;$i<=$width;$i++)
 {
  $xK[] = $x;
  $yK[] = $y;
  $x++;
  $y++;
 }
 imagecopymerge($image, $punkt, $x, $y,  0, 0, $width, $height, 100);
}
 
imagejpeg($image);

imagedestroy($image);
imagedestroy($punkt);
 
Zuletzt bearbeitet:
Zurück