[PHP] Komplizierte Belegung eines Planquadrates mit Punkten?

BartTheDevil89

Devilution Media
ID: 87739
L
2 Mai 2006
3.960
103
Hallo,

diesmal ist meine Aufgabe etwas komplex. Ich habe ein System mit x und y-Werten. Diese ordnen sich nach folgendem System an:

https://www.myimg.de/?img=island3ff.jpg

X ist dabei immer der obere und Y immer der Wert nach unten. Also wären diese Inseln in der oberen Zeile x=3 und y=1 und die ganz hinten wäre dann x=12 und y=1! Das ganze System geht natürlich nach unten weiter. Also es ist ein komplexes System, was nach rechts und nach unten erweitert wird.

Wichtig ist, dass die Punkte eigentlich nie nebeneinander liegen sollten.

Jetzt muss ich diese blauen Punkte bestimmen. Es sollen also diese blauen Punkte erstellt werden. Jeweils x und y-Wert muss einzeln am Ende rauskommen.

Gibt es eine Möglichkeit das zu automatisieren? Ich gebe beispielsweise den minimalen x , maximalen x und minimalen y , maximalen y-Wert an und das System errechnet mir dann ein Anzahl an x und y-Werten für diesen Bereich?

Wenn dieses Problem von jemandem gelöst werden würde, könnte auch etwas Geld für die Lösung bei rauskommen. Eventuell auch in anderen sprachen als php, aber ich brauche irgendwie ne Lösung!
 
Ich versteh nicht, was an dem System kompliziert is: Sind halt 2 for-Schleifen

Du willst einfach nur Punkte erstellen, die nicht nebeneinander liegen ? Dann ist wohl das einfachste Muster das hier:
x∊{n|2n+1; nN0} ∧ y∊{n|2n+1; nN0} ;)

In PHP:
PHP:
$max_y=1000; $max_x=1000;
for($y=1;$y<$max_y;$y+=2)
  for($x=1;$x<$max_x;$x+=2)
    echo "($x | $y)\n";
 
theHacker schrieb:
Ich versteh nicht, was an dem System kompliziert is: Sind halt 2 for-Schleifen

Du willst einfach nur Punkte erstellen, die nicht nebeneinander liegen ? Dann ist wohl das einfachste Muster das hier:
x∊{n|2n+1; nN0} ∧ y∊{n|2n+1; nN0} ;)

In PHP:
PHP:
$max_y=1000; $max_x=1000;
for($y=1;$y<$max_y;$y+=2)
  for($x=1;$x<$max_x;$x+=2)
    echo "($x | $y)\n";

Naja, es soll nicht symetrisch sein. Er sollen unterschiedlich viele Freiräume zwischen den Punkten sein.

Außerdem müsste ich noch einen minimalen wert angeben können. Also wenn ich beispielsweise schon von x 1 bis x 12 schon welche habe und dann ab x 12 erst anfangen will.
 
BartTheDevil89 schrieb:
Außerdem müsste ich noch einen minimalen wert angeben können. Also wenn ich beispielsweise schon von x 1 bis x 12 schon welche habe und dann ab x 12 erst anfangen will.
Wie meinst du das "x n" ? :hö:
BartTheDevil89 schrieb:
Naja, es soll nicht symetrisch sein. Er sollen unterschiedlich viele Freiräume zwischen den Punkten sein.
Mach ne Schleife, die per Zufall Koordinaten erzeugt.
Überprüfe, ob der Punkt den nötigen Freiraum (im Bereich x-s<x<x+sy-s<y<y+s) hat und trage ihn ein oder nicht.

PHP:
for($i=0;$i<max_points;$i++)
{
  do
  {
    $x=rand()%1000;
    $y=rand()%1000;
  } while(!check_point($x,$y));
  add_point($x,$y);
}
 
theHacker schrieb:
Wie meinst du das "x n" ? :hö:
Mach ne Schleife, die per Zufall Koordinaten erzeugt.
Überprüfe, ob der Punkt den nötigen Freiraum (im Bereich x-s<x<x+sy-s<y<y+s) hat und trage ihn ein oder nicht.

PHP:
for($i=0;$i<max_points;$i++)
{
  do
  {
    $x=rand()%1000;
    $y=rand()%1000;
  } while(!check_point($x,$y));
  add_point($x,$y);
}
Bei der letzten Version kommt leider garnichts raus. Aber die Idee scheint gut zu sein. Ich geh also jede einzelne x-Reihe ab und füge dort in einem zufälligen Abstand diese Punkte ein. Durch diese zufälligen Abstände wird das ganze auch nicht symetrisch, sondern eben schön unterschiedlich.

Das mit x1 und so meine ich, dass $i nichnur <max_points, sondern auch >min_points sein sollte.
 
KussMar schrieb:
Lösungsansatz von mir haste im ICQ,
Krieg ich den auch hier im Thread, damit ich mitreden kann ? ;)
KussMar schrieb:
@Hacker: iss bissl komplizierter ;)
Deiner oder meiner ?
BartTheDevil89 schrieb:
Aber die Idee scheint gut zu sein. Ich geh also jede einzelne x-Reihe ab und füge dort in einem zufälligen Abstand diese Punkte ein.
Falsch verstanden.
Du gibts vor, wieviele Punkte du haben willst ($max_points). Die Schleife geht nun solange durch, bis alle Punkte in einem gewünschten Abstand/Kritieren erfüllt sind.
BartTheDevil89 schrieb:
Das mit x1 und so meine ich, dass $i nichnur <max_points, sondern auch >min_points sein sollte.
Versteh ich immer noch ned, weil du ja meine $max_points-Variable falsch verstanden hast.
 
theHacker schrieb:
Krieg ich den auch hier im Thread, damit ich mitreden kann ? ;)Deiner oder meiner ?
Falsch verstanden.
Du gibts vor, wieviele Punkte du haben willst ($max_points). Die Schleife geht nun solange durch, bis alle Punkte in einem gewünschten Abstand/Kritieren erfüllt sind.
Versteh ich immer noch ned, weil du ja meine $max_points-Variable falsch verstanden hast.
Achso,

also, das mit dem max_points hab ich leider falsch formuliert. Das bezieht sich auf die Version hier:

PHP:
$max_y=1000; $max_x=1000; 
for($y=1;$y<$max_y;$y+=2) 
  for($x=1;$x<$max_x;$x+=2) 
    echo "($x | $y)\n";

Aslso $y eben nichtnur $max_y, sondern auch $min_y. Bzw. dass ich eben nicht bei $y=1 anfange, sondern bei $y=10 oder so.

Jetzt müsste ich in diese obere Verison aber noch einarbeiten, dass es nicht immer +2 sein soll, sondern $y immer +1, dass er also jede y-Reihe durchgeht und bei x müsst es nicht +2, sondern +$zahl sein und $zahl muss beispielsweise eine Zahl zwischen 3 und 5 sein. Also irgendwie so muss das doch dann sein:

PHP:
$max_y=1000; $max_x=1000; 
for($y=1;$y<$max_y;$y+=1) 
$zahl = rand(3,5); 
  for($x=1;$x<$max_x;$x+=$zahl) 
    echo "($x | $y)\n";

oder wie müsste das richtig lauten?
 
BartTheDevil89 schrieb:
Jetzt müsste ich in diese obere Verison aber noch einarbeiten, dass es nicht immer +2 sein soll, sondern $y immer +1, dass er also jede y-Reihe durchgeht und bei x müsst es nicht +2, sondern +$zahl sein und $zahl muss beispielsweise eine Zahl zwischen 3 und 5 sein.
[...]
oder wie müsste das richtig lauten?
Wenn du Klammern setzt, würde deine Version schon funktionieren, allerdings klappt das nicht, weil du nicht ausschließen kannst, dass 2 Punkte nebeneinander sind.
Kommt es dir darauf an, würde ich die obere Variante sofort vergessen und mir meine zweite Variante mal genauer ansehen.


btw. Quote bitte mal richtig :pray:
 
theHacker schrieb:
btw. Quote bitte mal richtig :pray:

Ich glaub, ich gewöhn es mir wohl eher an das ganze komplett wegzulassen.:ugly:

Wenn 2 Punkte untereinander vielleicht sind, kann man zwar nichts machen, aber das wäre jetzt erstmal nicht so schlimm. Kann ja nachher mit der Hand nochmal drüber gehen und diese dann löschen.

Wichtig wäre, dass diese Version hier laufen würde. Also, was meinst du mit Klammern? Und als letztes Vielleicht, wie könnte ich noch hinzufügen, dass er bei der x-Zahl nicht bei 1 beginnt(denn dann wäre ja immer bei x=1 eines), sondern er dort auch $x = 1 + $zahl macht? Also er diese $zahl auch dort einfügt?

PHP:
$max_y=1000; $max_x=1000; 
for($y=1;$y<$max_y;$y+=1) 
$zahl = rand(3,5); 
  for($x=1;$x<$max_x;$x+=$zahl) 
    echo "($x | $y)\n";
 
soll das jetzt für ein Browsergame sein? Ob 2 Punkte jetzt zu nah aneinander sind kannst du ja mit (x_i-x)²+(y_i-y)² < minentfernung² für alle Punkte i die vorher schon gelegt wurden. x und y kannst du ja mit rand(xmin,xmax) und rand(ymin,ymax) vorbelegen, so hast du eine recht zufällige Verteilung. Wenn du aber lieber sowas haben willst, dass sich z.B. Ringe bilden wie bei die-staemme, dann würde ich mit Polarkoordinaten arbeiten.
Also z.B.
PHP:
$phi = mt_rand(0,10000)/10000*atan(1)*8; //Zahl zwischen 0 und 2 Pi
$r = mt_rand($min_radius, $max_radius);
$x = $r * cos($phi);
$y = $r * sin($phi);
und testen halt wie es theHacker gemeint hat in einer eigenen Funktion
z.b. mit den (x_i-x)²+(y_i-y)² < min_entfernung²
Aber ich glaube eher ich habe nicht ganz verstanden was du genau willst.

MfG respawner
 
BartTheDevil89 schrieb:
Und als letztes Vielleicht, wie könnte ich noch hinzufügen, dass er bei der x-Zahl nicht bei 1 beginnt(denn dann wäre ja immer bei x=1 eines), sondern er dort auch $x = 1 + $zahl macht? Also er diese $zahl auch dort einfügt?
Hierzu: :rtfm: <- Faule klicken einfach den Smilie an (und meine Änderung unten)
BartTheDevil89 schrieb:
Also, was meinst du mit Klammern?
Dass du erst nachdenken sollst, was du tust und es dann machen solltest:
$max_y=1000; $max_x=1000;
for(
$y=1;$y<$max_y;$y+=1)
{

$zahl
= rand(3,5);
for(
$x=1+$zahl;$x<$max_x;$x+=$zahl)
echo
"($x | $y)\n";
}
Ist mehr als eine Zeile in der Schleife, muss geklammert sein ;)
 
Ja, es tut mir Leid:roll:

Darf ich aber noch was letztes Fragen? Denn so, wie es im Moment ist, macht der ja für jede y-Zeile immer nur ein Zahl, beispielsweise 3 und setzt die ein. Dann sind allso alle Inseln bei y=1 für x=3, x=6, x=9......

Er soll bei jedem x noch eine neue Zahl erstellen!:roll:
 
BartTheDevil89 schrieb:
Er soll bei jedem x noch eine neue Zahl erstellen!:roll:
PHP:
$max_y=1000; $max_x=1000;  
for($y=1;$y<$max_y;$y+=1)  
{
  for($x=1+rand(3,5);$x<$max_x;$x+=rand(3,5))  
    echo "($x | $y)\n";
}
Meinst du das ?
 
theHacker schrieb:
PHP:
$max_y=1000; $max_x=1000;  
for($y=1;$y<$max_y;$y+=1)  
{
  for($x=1+rand(3,5);$x<$max_x;$x+=rand(3,5))  
    echo "($x | $y)\n";
}
Meinst du das ?

Hey, genau so mein ich das!

Perfekt, vielen Dank!:D

Ps.: Das mit dem Threadtitel und dem [] davor hab ich auch gelernt von dir, das heißt das mit QUOTE und mit dem besser nachschauen schaff ich auch noch.;)