JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=d56cae37e8ed7bc0e58f8da958b25728Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Zufällige Vektoren mit Polarkoordinaten

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 14.10.2006, 02:21    Titel: Zufällige Vektoren mit Polarkoordinaten Antworten mit Zitat

Ich zermatere mir gerade seit geraumer Zeit meinen Kopf über ein ziemlich mathematisches Problem. Kann sein, dass ich gerade einfach nur eine totale Hirnblockade habe und deswegen nicht drauf komme.

Ich möchte mit Polarkoordinaten zufällige Vektoren erstellen. Nennen wir den Längengrad mal Alpha und den Breitengrad Beta. Gegeben habe ich Bereiche in denen das Alpha und das Betha des Vektors liegen müssen. Nun irgendeinen zufälligen Vektor zu kriegen ist ja nicht weiter schwer. Man holt sich einfach zwei Zufallswerte und führt damit zwei lineare Interpolationen zwischen den Begrenzungen von Alpha und Beta durch.

Das Problem ist nur, dass die Vektoren dann ungleichmäßig verteilt sind. Für ein bestimmtes Alpha hat der Kreis auf dem die Vektoren mit diesem Alpha und einem zufälligen Beta liegen werden einen Radius von 2*Pi*|cos(Alpha)|. Das heißt bei Alpha gleich Pi/2 (bzw. 90°) sind alle Vektoren identisch, bei Alpha gleich 0 hingegen verteilen sie sich, wenn man sie als Ortsvektoren betrachtet, über einen Kreis mit dem Radius 2*Pi. Diese ungleichmäßige Verteilung fällt, da ich diese Methode für meine Partikeleffekte verwende außerordentlich stark auf Confused . Und wie gesagt, ich komme im Moment einfach nicht drauf, wie ich eine gleichmäßige Verteilung erzielen kann.

Um nochmal genau zu sagen, was ich mit einer gleichmäßigen Verteilung meine: Angenommen man berechnet mit der angestrebten Formel unendlich viele Vektoren. Wenn man sich dann zwei beliebige Ausschnitte der Kugeloberfläche auf der die Vektoren liegen mit gleicher Fläche aussucht, sollte in diesen die gleiche Anzahl von Vektoren liegen.

Ich hoffe irgendwer von euch kommt auf die Lösung. Schonmal danke im voraus.

MfG
Dr. Best


Zuletzt bearbeitet von Dr. Best am 14.10.2006, 13:53, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 14.10.2006, 09:42    Titel: Antworten mit Zitat

öhm, ich hab jetzt noch nicht so ganz genau verstanden was du eigentlich willst. Vielleicht mal mit weniger Fachwörtern und evtl. einer Skizze, dann kann es gut sein, das mir was einfällt.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Maxim
Senior JLI'ler



Anmeldedatum: 28.03.2004
Beiträge: 249

Medaillen: Keine

BeitragVerfasst am: 14.10.2006, 11:14    Titel: Antworten mit Zitat

Für alle, die nicht wissen was Polarkoordinaten sind:
http://de.wikipedia.org/wiki/Polarkoordinaten

So weit ich dich verstanden habe, willst du einfach eine Möglichkeit haben Vektoren zu erzeugen, die von einem Mittenpunkt ausgehen und deren Verteilung in jede Richtung gleich ist. Beipiel: bei einem Zauber sollen in jede Richtung gleiche Anzahl von Geschossen fliegen.

So nebenbei: soll das 2D oder 3D sein? Du hast es nicht explizit erwähnt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 14.10.2006, 14:27    Titel: Antworten mit Zitat

@ Jona
Ok, ich lasse mal ein bisschen Code und einen Screenshot für mich sprechen Wink . Die einfachste Methode eine Funktion zu erstellen, die zufällige Vektoren im gegebenen Bereich erstellt ist folgende:
CPP:
// Dieser Konstruktor erstellt einen zufälligen Vektor, dessen Längen- und Breitengrad innerhalb eines gegebenen Bereichs liegt.
C3DVector(float MinLongitude,float MinLatitude,float MaxLongitude,float MaxLatitude){
   // Führe mit zufälligen Werten zwischen 0 und 1 (die von FastRandPercent zurückgegeben werden) eine lineare Interpolation zwischen den gegebenen Begrenzungswerten durch
   float Longitude=MinLongitude+(MaxLongitude-MinLongitude)*FastRandPercent();
   float Latitude=MinLatitude+(MaxLatitude-MinLatitude)*FastRandPercent();
   // Berechne daraus einen Vektor
   float CosLongitude=cos(Longitude);
   x=CosLongitude*sin(Latitude);
   y=-sin(Longitude);
   z=CosLongitude*cos(Latitude);
}

Hab die Kommentare mal übersetzt.

Wenn ich diesen Code jetzt verwende um für jeden Partikel eine zufällige Startposition zu berechnen sieht man wo das Problem liegt:

Die Partikel sind oben und unten extrem dicht, während es auf halber Höhe nur sehr wenige gibt. Das liegt daran, dass durch den verwendeten Code für jeden Längengrad der Wahrscheinlichkeit nach gleich viele Partikel erstellt werden. Aber desto größer der Sinus des Längengrades betragsmäßig ist, desto kleiner ist der Bereich auf den sich diese Partikel verteilen. Das geht auf eine sehr direkte Weise aus x=CosLongitude*sin(Latitude); und z=CosLongitude*cos(Latitude); hervor.

Ich brauche also irgendeine Formel um die Berechnung der zufälligen Längengrade so zu verändern, dass die Verteilung der Vektoren überall gleichmäßig ist.

@ Maxim
Ja, hast du fast richtig verstanden. Bloß, dass sie sich nicht zwangsläufig in jede Richtung gleichmäßig verteilen sollen. Sie müssen bloß einen Längen- und Breitengrad haben der in einem bestimmten vorgegebenen Bereich liegt.

Und das ganze soll 3D sein. Hast recht, hab ich vergessen explizit zu sagen. Ging aber auch indirekt aus dem Text hervor, z.B. weil ich im letzten Abschnitt von einer Kugel gesprochen habe. Außerdem ergeben sich durch zwei Winkel bei Polarkoordinaten ja zwangsläufig 3D-Vektoren (oder Rolling Eyes ?). Außerdem bin ich ein hoffnungsloser 3D Fanatiker und würde nie auf den Gedanken kommen irgendwas in 2D zu machen Very Happy .
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 14.10.2006, 14:51    Titel: Antworten mit Zitat

Hm, was ist den wenn du einfach einen Vector mit 3 Zufallszahlen zwischen -10 und 10 erstellst und den dann normalisierst. Ich meine, müsste ja schnell getippt sein, da sollte die Verteilung doch besser sein, oder?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 14.10.2006, 14:54    Titel: Antworten mit Zitat

Hmm...sehe ich das richtig, dass die Pfeile der Vektoren alle als Startpunkt den Nord- bzw. Südpol der Kugel haben?

Ich könnte mir vorstellen, dass du am Anfang eben keine lineare Interpolation brauchst, sondern vielleicht Interpolation mit dem sinus (oder vllt. sinus²?). Ist jetzt nur eine schnelle Idee, die noch nicht zu Ende gedacht ist.

Wenn du linear interpolierst, ist es klar, dass für jeden Winkel etwa gleichviele Partikel entstehen und in der Nähe der Pole natürlich dichter zusammen liegen. Wenn du jetzt die Werte zwischen 0 und 1 so interpolierst, dass die Winkel, bei denen die Partikel nahe an den Polen liegen, seltener vorkommen(Bei sin(x) kommen z.B. für 0°<x<45° mehr höhere Werte in Richtung 1 vor).
Sorry, hab mich jetzt nicht wirklich in den Code hineingedacht, vielleicht hilfts ja Razz
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 14.10.2006, 15:46    Titel: Antworten mit Zitat

@ Jona
Da hätte ich dann bloß andere Stellen mit überdurchschnittlich hoher Partikeldichte. Wären zwar nicht mehr ganz so stark, aber immernoch vorhanden. Außerdem kann ich dann ja nicht mehr bestimmte Bereiche für die Längen- und Breitengrade definieren. Und dass das geht ist schon wichtig.

@ TLoP
Jo, so weit war ich auch schon. Hab da auch schon einiges ausprobiert, aber das war alles nicht richtig. Und die richtige Lösung mathematisch herzuleiten ist mir bis jetzt halt auch nicht gelungen. Außerdem ergibt sich wenn man beim berechnen der Zufallswerte mit den Ergebnissen Trigonometrischer Funktionen arbeitet noch ein neues Problem. Wenn du zum Beispiel als MinLongitude 0 und als MaxLongitude 2*Pi angegeben hast würdest du ja erwarten, dass jede Longitude vorkommen kann. Aber da die Trigonometrischen Funktionen periodisch sind erhältst du das gleiche Ergebnis wie bei MinLongitude=MaxLongitude=0.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 14.10.2006, 16:42    Titel: Antworten mit Zitat

Dr. Best hat Folgendes geschrieben:
Wenn du zum Beispiel als MinLongitude 0 und als MaxLongitude 2*Pi angegeben hast würdest du ja erwarten, dass jede Longitude vorkommen kann. Aber da die Trigonometrischen Funktionen periodisch sind erhältst du das gleiche Ergebnis wie bei MinLongitude=MaxLongitude=0.

Dann würde ich diese Werte auf Werte zwischen 0 und PI/2 runterrechnen. Das Ergebnis kannst du hinterher immer noch hochrechnen, damits zwischen dem angegebenen Min und Max liegt. Die Idee, die ich hatte, war auf eine Einheitskugel bezogen.
Hast dus auch mit sin²(x) versucht?

Was genau war denn nicht richtig?
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 14.10.2006, 17:04    Titel: Antworten mit Zitat

Cool, danke. Du hast mich dazu veranlasst nochmal einige Sachen auszuprobieren und dabei bin ich über die richtige Lösung gestolpert. Wenn man diesen Code verwendet kriegt man eine gleichmäßige Verteilung über die Einheitskugel.
CPP:
   float Longitude=asin(FastRandPercent()*2.0f-1.0f);
   float Latitude=MinLatitude+(MaxLatitude-MinLatitude)*FastRandPercent();
   float Length=MinLength+(MaxLength-MinLength)*FastRandPercent();
   float CosLongitude=cos(Longitude);
   x=CosLongitude*sin(Latitude)*Length;
   y=-sin(Longitude)*Length;
   z=CosLongitude*cos(Latitude)*Length;

Jetzt muss ich mir nur noch überlegen wie ich MinLongitude und MaxLongitude dadrin korrekt implementieren kann.
Nochmal danke an alle Very Happy .
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum