[INFO/LIB] Objekte in einem Konus erfassen / Get FPS
Posted: Wed, 23. Apr 08, 19:32
(Get FPS: siehe unten)
Ich wollte eine Methode finden um Objekte in einem 90° Winkel vor dem Schiff zu erfassen.
Das aber sauber und nicht als Annäherung mit 10 Find-Kugeln, deren Ergebnisse ich dann alle auswerten muß.
Das Ergebnis: 1 einmaliger library call und pro Objekt 3 Instruktionen als Filter.
Das soll alles sein? Ist es.
Als Basis braucht man 2 Punkte.
In meinem Fall war das
1. das Schiff und
2. ein Punkt 5000m hinter dem Schiff.
(leicht zu finden mit UniTraders lib.ut.pos.from.2.grades.and.rad)
Sieht dann in etwa so aus:
00 ObjArray = Find blah
01 Point = Punkt behind ship 5000
02
03 index = size of array
04 Filter:
05 While index
06 dec index
07 Obj = ObjArray (index)
08 Dist.Ship = distance between Ship and Obj
09 Dist.Point = distance between Point and Obj
10 skip if not Dist.Ship + 4700 > Dist.Point
11 remove element from array ObjArray at index index
12 end
Mit der Zahl 4700 wird der Winkel eingestellt.
Hier einige Beispielwerte. Die Liste ist weiter unten.
4860 : 30°
4710 : 45°
4630 : 50°
4380 : 65°
4300 : 80°
3860 : 90°
2520 : 135°
Auf die Weise kann ich mit nur 3 Befehlen (Zeilen 5-7) feststellen, ob das Objekt in dem Konus ist oder nicht.
Eine immense Einsparung gegenüber dem Ansatz, für jedes einzelne Objekt die komplette Trigonometrie durchzuackern.
Wer nur die eine Formel umstellt, kann berechnen wieviel Grad ein Objekt außerhalb der Flugrichtung des Schiffs ist...
[ external image ][ external image ] . . . selbe Funktion, andere Auflösung.
Bei großen Entfernungen (005 - 600 km) sieht das aus wie ein perfekter Konus aber eine Betrachtung des Nulldurchgangs zeigt schnell, daß es eine Parabel ist.
Mit dem "4700" Winkel liegt der Nullpunkt 145 m hinter dem Schiff.
Für höhere Genauigkeit kann man die 2 Referenzpunkte verschieben aber im Nahbereich wird die Methode nie perfekt sein.
Wer eine bessere Lösung hat (die in einem Script immer noch berechenbar ist) darf mich gerne korrigieren.
Für Navigations- und Kampfscripts kann ich mir schon einige Anwendungen vorstellen.
Schließlich kann man ja einen Konus vor, einen anderen hinter dem Schiff oder alle Objekte, die in keinem von beiden enthalten sind herausfiltern.
Für das gute alte N.O.S. wäre sowas z.B. nett. So kann ich recht schnell feststellen ob auf meinem Kurs Bösewichte herumfliegen.
Ich wollte eine Methode finden um Objekte in einem 90° Winkel vor dem Schiff zu erfassen.
Das aber sauber und nicht als Annäherung mit 10 Find-Kugeln, deren Ergebnisse ich dann alle auswerten muß.
Das Ergebnis: 1 einmaliger library call und pro Objekt 3 Instruktionen als Filter.
Das soll alles sein? Ist es.
Als Basis braucht man 2 Punkte.
In meinem Fall war das
1. das Schiff und
2. ein Punkt 5000m hinter dem Schiff.
(leicht zu finden mit UniTraders lib.ut.pos.from.2.grades.and.rad)
Sieht dann in etwa so aus:
00 ObjArray = Find blah
01 Point = Punkt behind ship 5000
02
03 index = size of array
04 Filter:
05 While index
06 dec index
07 Obj = ObjArray (index)
08 Dist.Ship = distance between Ship and Obj
09 Dist.Point = distance between Point and Obj
10 skip if not Dist.Ship + 4700 > Dist.Point
11 remove element from array ObjArray at index index
12 end
Mit der Zahl 4700 wird der Winkel eingestellt.
Hier einige Beispielwerte. Die Liste ist weiter unten.
4860 : 30°
4710 : 45°
4630 : 50°
4380 : 65°
4300 : 80°
3860 : 90°
2520 : 135°
Auf die Weise kann ich mit nur 3 Befehlen (Zeilen 5-7) feststellen, ob das Objekt in dem Konus ist oder nicht.
Eine immense Einsparung gegenüber dem Ansatz, für jedes einzelne Objekt die komplette Trigonometrie durchzuackern.
Wer nur die eine Formel umstellt, kann berechnen wieviel Grad ein Objekt außerhalb der Flugrichtung des Schiffs ist...
[ external image ][ external image ] . . . selbe Funktion, andere Auflösung.
Bei großen Entfernungen (005 - 600 km) sieht das aus wie ein perfekter Konus aber eine Betrachtung des Nulldurchgangs zeigt schnell, daß es eine Parabel ist.
Mit dem "4700" Winkel liegt der Nullpunkt 145 m hinter dem Schiff.
Für höhere Genauigkeit kann man die 2 Referenzpunkte verschieben aber im Nahbereich wird die Methode nie perfekt sein.
Wer eine bessere Lösung hat (die in einem Script immer noch berechenbar ist) darf mich gerne korrigieren.
Für Navigations- und Kampfscripts kann ich mir schon einige Anwendungen vorstellen.
Schließlich kann man ja einen Konus vor, einen anderen hinter dem Schiff oder alle Objekte, die in keinem von beiden enthalten sind herausfiltern.
Für das gute alte N.O.S. wäre sowas z.B. nett. So kann ich recht schnell feststellen ob auf meinem Kurs Bösewichte herumfliegen.