Vektor klasse

    • Skript

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

    • Vektor klasse

      Ich deklariere das hier mal gleich als Experiment, bevor jemand über den Nutzen zu motzen anfängt. Da ich da aber ein gewisses Potential sehe, will ich euch dieses Fundstück aus meinem Archiv nicht vorenthalten.


      Also, es ging mir darum, per GML etwas zu gestalten, dass so nah wie möglich an die Klassen heran kommt, die man aus OOP anderer Sprachen kennt.
      Heraus gekommen ist eine "Klasse" die das rechnen mit Vektoren erleichtern soll und zudem sehr leicht zu erweitern ist.

      Folgendes Beispiel zeigt was ich meine

      GML-Quellcode

      1. foo = vector( 512, 541 );
      Erstellt ein 2D Vektorobjekt. Es sind bis zu 16 Dimensionen möglich ( da nur 16 Argumente ).
      Wer jetzt was damit anfangen will, kann zB. folgendes machen

      GML-Quellcode

      1. bar = foo.a;
      "bar" ist damit jetzt 512. Man kann also foo.a, foo.b, foo.c usw. nutzen. Wer eher auf Arrays steht, oder einfach gerne durch die Werte iteriert, kann foo.value[n]; nutzen. Für eine Iteration ist sicherlich auch foo.count relevant, welches die Anzahl der Dimensionen wieder gibt.


      Damit das ganze nicht so nutzlos ist, wie es jetzt erscheint, habe ich noch ein paar Funktionen hinzu gefügt:
      vector_angle( vec1, vec2 ); Man nehme 2 2Dimensionale Vektoren und bekommt den Winkel zwischen diesen zurück

      vector_dotproduct( vec1, vec2 ); 2 2Dimensionale oder 3Dimensionale Vektoren sind für dieses Rechenstück notwendig

      vector_length( vec ); Die Länge eines Vektor mit beliebig vielen Dimensionen lässt sich mit dieser Funktion bestimmen


      Wer sich mal die Funktionen ansieht, wird bemerken, dass diese erschreckend einfach sind, und leicht zu erweitern sind. Ich freue mich schon auf die ersten Funktionen fürs Skalarprodukt oÄ.

      Das unten verlinkte Bespiel enthält nicht nur die für den Export fertigen Scripte, sondern auch ein kleines Beispiel mit ein paar Rechnungen.

      Und ein Wort zur Performance will ich noch verlieren: Da jeder Vektor eine eigene Instanz ist, sollte man aufpassen, nicht zu viele gleichzeitig zu haben. Man kann Vektoren wieder mit vector_destroy() entfernen.

      Für GM8.1
      und für nicht gm8.1ler
      Die GML Scripte für andere (vector_dotproduct() nur mit Modifikationen nutzbar)


      MfG SDX
    • GML-Quellcode

      1. return (cos((vector_dotproduct(a,b)/1000)/((vector_length(a)+vector_length(b))/1000)*1000)*180)/pi;

      Abgesehen davon, dass mir sehr unklar ist, wofür der Faktor 1000 gut ist: Für das Skalarprodukt im euklidischen Raum gilt a*b = |a||b|*cos(phi), d.h. cos(phi)=a*b/(|a||b|),
      so wie ich das sehe müsstest du doch also die Umkehrfunktion vom Cosinus nutzen, um an den Winkel zu kommen, und im Nenner multiplizieren statt zu addieren? Ich hab jetzt nicht getestet, ob das wirklich nicht funktioniert, was du da gecoded hast, aber ich möchte mal stark daran zu Zweifeln.

      Weitere Verbesserungsvorschläge: Die Definition des Skalarproduktes für Vektoren beliebiger Dimension, Kreuzprodukt zumindest für dreidimensionale Vektoren, Normalisierung von Vektoren.

      Vektoraddition und multiplikation mit einem Skalar sind ebenfalls noch nicht implementiert so wie ich das sehe, dabei sind diese Operationen sehr wichtig. Auf der anderen Seite kann ich verstehen, wieso du diese noch nicht implementiert hast: Es müssen neue Objekte erzeugt werden, d.h. der Nutzer der Klasse muss selbst den Speicher verwalten. Solange sich dieses Problem nicht praktisch lösen lässt ist der Nutzen der Klasse leider sehr beschränkt behaupte ich mal ...