Vektorklasse(mathematisch) für C++



  • Hallo
    Ich suche eine gute Vektorklasse, die alle gängigen mathematischen Operation mit Vektoren macht. Also sowas wie +,-,*,/, fabs(), Einheitsvektor, Länge, etc.
    Gibt es da eine empfehlenswerte Klasse?
    Muss auch nicht sonderlich viel anderen Schnickschnak enthalten, eine Vektorklasse reicht mir.

    P.S. Zum selber schreiben bin ich gerade etwas zu faul, zumal ich für das Projekt eine 100% funktionierende Klasse brauche.



  • Eine Vektorklasse hat man einfach mal selber geschrieben. :p

    Nein, schau dir vielleicht einmal Boost.uBLAs an. Boost hat zu sehr vielen Dingen etwas... 😉



  • Vektor-Klassen gibt es sehr viele. Allerdings ist ein Großteil davon für Grafikanwendungen optimiert, also auf 2D oder 3D spezialisiert.

    Zu Boost: (Ich weiß, ich werde gleich gesteinigt oder gekreuzigt oder so) Das letzte mal, dass ich solche Vektoren und Matrizen brauchte fand ich die Boost-Bibliothek aus irgendeinem Grund furchtbar abschreckend. Ich habe dann die c-funktionen aus der gnu scientific library in dünne Wrapper gepackt. Die funktioniert wie gefordert 100%-ig. Bei mir lief das sehr gut.

    Für manche Sachen kann man auch std::val_array benutzen. Schön ist auch Blitz++: http://www.oonumerics.org/blitz/



  • Wirdbald schrieb:

    Zu Boost: (Ich weiß, ich werde gleich gesteinigt oder gekreuzigt oder so) Das letzte mal, dass ich solche Vektoren und Matrizen brauchte fand ich die Boost-Bibliothek aus irgendeinem Grund furchtbar abschreckend.

    Das hat was. Ich selber habe Boost.uBLAS noch nie benutzt, und die Online-Dokumentation kam mir auch etwas kryptisch vor.

    Vektor-Klasse, benötigst du allgemeine n-dimensionale Vektoren? Oder reichen dir zwei- und dreidimensionale? Bei diesen wäre dann eventuell der Umgang etwas leichter, da man spezifische Methoden wie GetX() anbieten kann.



  • Hauptsächlich 3D Vektoren...
    Also das Schreiben einer eigenen Klasse wäre ja wirklich nicht viel arbeit, aber mit den überladenen Operatoren und so ist das erstmal recht viel (bzw. für die kleinigkeiten die ich brauche) zu viel wie ich finde.
    Klar kann man später mal ne eigene Klasse implementieren, aber warum das Rad ein zweites mal erfinden wenn man gerade eine Klasse für ein fertiges Programm braucht?



  • Wiess nicht genau ob es dir hilft, falls nicht ignorier den Post bitte.
    Für meine Kameraklasse hatte ich da mal was getippt:

    struct tVector3	
    {			
    	tVector3() {} 
    
    	tVector3 (float new_x, float new_y, float new_z) 	 
    	{
    		x = new_x; y = new_y; z = new_z;
    	}
    
    	tVector3 operator+(tVector3 vVector) 
    	{
    		return tVector3(vVector.x+x, vVector.y+y, vVector.z+z);
    	}
    
    	tVector3 operator-(tVector3 vVector) 
    	{
    		return tVector3(x-vVector.x, y-vVector.y, z-vVector.z);
    	}
    
    	tVector3 operator*(float number)	 
    	{
    		return tVector3(x*number, y*number, z*number);
    	}
    
    	tVector3 operator/(float number)	
    	{
    		return tVector3(x/number, y/number, z/number);
    	}
    
    	float x, y, z;						
    };
    


  • so funktioniert aber nur mit der gleitkommazahl rechts des * bzw /

    tVector v1,v2; 
    // füllen
    v2 = v1 * 3.0;
    

    damit sowas

    tVector v1,v2;
    //füllen 
    v2 = 3.0 * v1;
    

    funktioniert, braucht man eine globale Operatorüberladung, wobei die Operatorfunktion in der klasse natürlich als friend deklariert werden muss.



  • Hi!

    Ich habe vor ein paar Tagen genau das gemacht, nämlich Klassen zur Handhabung von Vektoren (und Matrizen) geschrieben. Hier der Code:

    vertex.h
    vertex.cpp

    Grüe,
    Daniel



  • Ahh sauber danke! Das hilft mir schon sehr 🙂 Da fehlen zwar ein paar Funktionen wie z.B. fabs() aber die kann ich dann ja eben selber schnell implementieren. Hab dann aufjedenfall schonmal ein gutes Grundgerüst!
    Danke!



  • ip schrieb:

    Hi!

    Ich habe vor ein paar Tagen genau das gemacht, nämlich Klassen zur Handhabung von Vektoren (und Matrizen) geschrieben. Hier der Code:

    vertex.h
    vertex.cpp

    Grüe,
    Daniel

    Darf ich da auch noch 1,2 Worte dazu verlieren?
    1. Bitte, bitte fang niemals etwas mit Unterstrichen an.. (___VERTEX_H), gehört dem Compiler..
    2. @ PI und deg2rad(): Warum nicht eine konstante, anstatt des defines? Und inline Funktionen, anstatt defines?
    3. CVector: Über das C kann man sich streiten..
    4. Muss ein vector immer float sein? Ein Template wäre hier ev. angebracht..



  • Mein Vorschlag (braucht aber boost): http://www.geloescht.net/allerlei/mv.zip
    Enthält als Bonus noch ne Matrix-Klasse. Dimensionen müssen Compilezeitkonstanten sein. Einträge können beliebige numerische Datentypen sein (mathematisch ausgedrückt: Körper, es muss aber noch z.B. sqrt() definiert sein).
    Achja, was meinst du mit fabs() für Vektoren? Die Länge? Den Betrag aller Elemente des Vektors nehmen?


Anmelden zum Antworten