Zufällige Position erzeugen

    • Tut- Complete

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Zufällige Position erzeugen

      Das Erzeugen von zufälligen Positionen kann etwas tückisch werden, da das Spiel mit kartesischen Koordinaten arbeitet und bei einem zufälligem X plus einem zufälligem Y nun mal immer ein Quadrat oder Rechteck heraus kommt. Man merkt das natürlich nicht gleich, aber wir spielen ja alle Arma weil es so super realistisch ist. Daher wäre es ja ärgerlich wenn die geskriptete Artillerie eine unnatürliche quadratische Streuung aufweist... Nicht wahr?!?


      Weil man das Rad nicht jedes mal neu erfinden möchte, hier eine "Formelsammlung":



      Von links nach rechts:
      zufälliger Radius -- zufällige Position im Kreis -- Gaußsche Normalverteilung

      Links ist, was passiert, wenn man der getPos-Funktion einen zufälligen Radius und einen zufälligen Winkel gibt. Da der Abstand zweier Strahlen aus einem Zentrum zueinander immer weiter anwächst, bzw. die Fläche eines Kreises mit dessen Radius im Quadrat wächst, ergibt diese einfachste Formel eine Verteilung mit Tendenz zu einer Position im Zentrum.
      Das ist bei der Mitte behoben, indem die random-Funktion unter eine Quadratwurzel gezogen wurde. Eine kleine zufällige Zahl unter 1 wird nach dem Ziehen der Quadratwurzel Richtung der 1, bzw. der Außenseite vergrößert. Das Ergebnis ist eine perfekte Verteilung im Kreis.
      Bei Rechts wird die Syntax für die Gaußsche Normalverteilung von random für den Radius verwendet. Das ergibt dann ein realistisches Trefferbild, so wie man es "in der Natur" erwarten würde.



      Da man seine Spieler aber normalerweise nicht sofort wegbomben möchte, sondern eher für Kriegsambiente sorgen möchte, kann man stattdessen eine Position um die Spieler herum beschießen.



      Von links nach rechts:
      Invertierte Normalverteilung, zufälliger Radius -- Invertierte Normalverteilung, zufällige Position -- zufällige Position im Ring

      Links ist die Normalverteilung einfach invertiert ("1 minus Zufallszahl"). Damit ist ein Treffer am Rand am wahrscheinlichsten.
      Mitte kombiniert die Normalverteilung mit dem Wachsen der Fläche mit dem Radius im Quadrat. Das macht einen Treffer in der Mitte noch unwahrscheinlicher.
      Mit Rechts geht man auf Nummer sicher und erzeugt eine komplett zufällige Position in einem Ring. Das wird wiederum durch das Ziehen der Quadratwurzel erreicht. Da hier nicht mit [0,1] sondern mit den absoluten Zahlen gearbeitet wird, werden diese vorher quadriert. Das Zentrum bleibt dabei unberührt.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von commy2 ()

    • Es lassen sich auch mit wenig Aufwand Zufallspositionen in einer gedrehten Ellipse erstellen:



      _radius1 und _radius2 bezeichnen hier den maximalen und minimalen Abstand des Rands der Ellipse zu ihrem Zentrum.

      Dabei wird der Einfachheit halber die Verwerfungsmethode angewendet. Es wird eine zufällige Position in einem Rechteck erstellt und dann mittels inArea-Funktion überprüft, ob sich diese tatsächlich in der gewünschten Ellipse befindet. Falls nicht, wird das ganze mit einer neuen Position wiederholt.

      Im zweiten Schritt wird die Position um den Ursprung mit _angle-Grad im Uhrzeigersinn gedreht. Diesen Schritt kann man auch für Rechtecke und andere Formen so verwenden.
    • Ach was soll's. Natürlich kann man auch relativ einfach zufällige Punkte in einem beliebigen Dreieck generieren:




      Die Verwerfungsmethode ist besonders bei schmalen Dreiecken eher ungeeignet, deshalb kommt nun etwas lineare Algebra zum Einsatz. Man benötigt neben dem Ursprung nur die 3 Eckpunkte A, B und C relativ zu diesem. Es ist ja allgemein bekannt, dass zwei Vektoren ein Parallelogramm aufspannen. Von einem beliebigen Eckpunkt ausgehend (z.B. A), kann man das 0 bis 1 fache des Richtungsvektors zu einer zweiten Ecke (z.B. AB) gehen, und von dort aus das 0 bis 1 fache des Richtungsvektors der ersten Ecke zur dritten Ecke (z.B. AC). Wenn man dann noch die beiden Zufallszahlen für die Vektoren AB und AC invertiert, falls sie in Summe größer als 1 sind, halbiert man das Parallelogramm und man erhält ein Dreieck.
    • Hatte heute Morgen viel Zeit. Komplexe Formen können aus einfachen zusammengesetzt werden:




      Um dabei eine gleichmäßige Verteilung zu erhalten, sollte man zunächst die Flächeninhalte ausrechnen und mit Hilfe deren Verhältnis zueinander und einer Zufallszahl entscheiden, ob der nächste Punkt im z.B. Rechteck oder Ring landet. Die Formen können dann mit Hilfe weiterer Zusatzzahlen geteilt, oder sonst wie auseinander geschnitten werden. Natürlich kann die gesamte Form wie beim Beispiel der Ellipse um ihren Ursprung beliebig gedreht werden.