Kreuzprodukt



  • **Moinmoin!

    Vielleicht könnt ihr schlauen Köpfe mir ja weiterhelfen, denn ich verzweifle allmählich... 😞
    Meine hübsche kleine Funktion lässt sich beim besten Willen nicht kompilieren, und mir gehen allmählich die Ideen aus. 😕

    Die Aufgbabe: Implementierung des Kreuzproduktes für die gegebene Klasse Vector3D.

    Vector3D:**
    //--- Includes -----------------------------------------------------------------

    #include <cassert>
    #include <cmath>
    #include "Vector3D.h"

    //--- Klassenimplementierung ---------------------------------------------------

    Vector3D::Vector3D()
    {
    setXYZ(0, 0, 0);
    }

    Vector3D::Vector3D(float x, float y, float z)
    {
    setXYZ(x, y, z);
    }

    float Vector3D::x() const
    {
    return mElement[X];
    }

    float Vector3D::y() const
    {
    return mElement[Y];
    }

    float Vector3D::z() const
    {
    return mElement[Z];
    }

    float Vector3D::get(int index) const
    {
    assert(index >= X && index <= Z);
    return mElement[index];
    }

    void Vector3D::set(int index, float value)
    {
    assert(index >= X && index <= Z);
    mElement[index] = value;
    }

    void Vector3D::setX(float value)
    {


    }

    void Vector3D::setY(float value)
    {
    mElement[Y] = value;
    }

    void Vector3D::setZ(float value)
    {
    mElement[Z] = value;
    }

    void Vector3D::setXYZ(float newX, float newY, float newZ)
    {


    mElement[Y] = newY;
    mElement[Z] = newZ;
    }

    float Vector3D::length() const
    {


    mElement[Y] * mElement[Y] +
    mElement[Z] * mElement[Z]);
    }

    void Vector3D::normalize()
    {
    float scale = 1 / length();


    mElement[Y] *= scale;
    mElement[Z] *= scale;
    }

    Vector3D& Vector3D::operator +=(const Vector3D& rhs)
    {


    mElement[Y] += rhs.mElement[Y];
    mElement[Z] += rhs.mElement[Z];

    return *this;
    }

    Vector3D& Vector3D::operator -=(const Vector3D& rhs)
    {


    mElement[Y] -= rhs.mElement[Y];
    mElement[Z] -= rhs.mElement[Z];

    return *this;
    }

    Vector3D& Vector3D::operator *=(float rhs)
    {


    mElement[Y] *= rhs;
    mElement[Z] *= rhs;

    return *this;
    }

    Vector3D& Vector3D::operator /=(float rhs)
    {


    mElement[Y] /= rhs;
    mElement[Z] /= rhs;

    return *this;
    }

    //--- Verwandte Funktionen -----------------------------------------------------

    const Vector3D operator +(const Vector3D& lhs, const Vector3D& rhs)
    {
    return Vector3D(lhs) += rhs;
    }

    const Vector3D operator -(const Vector3D& lhs, const Vector3D& rhs)
    {
    return Vector3D(lhs) -= rhs;
    }

    const Vector3D operator *(float lhs, const Vector3D& rhs)
    {
    return Vector3D(rhs) *= lhs;
    }

    const Vector3D operator *(const Vector3D& lhs, float rhs)
    {
    return Vector3D(lhs) *= rhs;
    }

    const Vector3D operator /(const Vector3D& lhs, float rhs)
    {
    return Vector3D(lhs) /= rhs;
    }

    float dot(const Vector3D& lhs, const Vector3D& rhs)
    {
    return lhs.x() * rhs.x() + lhs.y() * rhs.y() + lhs.z() * rhs.z();
    }

    Mein bisheriger Lösungsansatz:
    #include <iostream>
    #include <stdlib.h>
    #include "Vector3D.h"

    using namespace std;

    int main(int argc, char *argv[])
    {
    float r, s, t;
    float n, m, p;

    Vector3D a(r, s, t);
    Vector3D b(n, m, p);

    Vector3D Kreuzprodukt(Vector3D a, Vector3D b);
    {
    float x, y, z;

    x = a.y*b.z-a.z*b.y;
    y = a.z*b.x-a.x*b.z;
    z = a.x*b.y-a.y*b.x;

    Vector3D c(x, y, z);
    return c;
    }
    ;

    system("PAUSE");
    return 0;
    }



  • dein

    Vector3D Kreuzprodukt(Vector3D a, Vector3D b);

    kommt über main

    und ich main kannst du ja

    Vector3D lsg = Kreuzprodukt(a, b);

    machen

    du kannst nicht mitten in main eine fkt deklarieren 🙄

    ich rate dir auch nicht mit unötigen kopien zu arbeiten

    also
    Vector3D Kreuzprodukt(Vector3D &a, Vector3D &b);

    so ich muss zocken

    cu



  • Danke! Darauf bin ich nun wirklich nicht gekommen. *schäm* ... das kommt davon wenn man andauernd zwischen den verschiedensten Sprachen hin und herspringen muss, da komm ich etwas durcheinander was wo erlaubt...



  • PS: noch "besser wäre"

    Vector3D Kreuzprodukt(const Vector3D &a, const Vector3D &b);  // wenn das geht
    


  • Es ist zum Mäusemelken...
    Meine Funktion hab ich jetzt brav innerhalb der Klasse Vector3D definiert, und der Compiler meckert ausnahmsweise mal nicht mehr mit mir.

    Vector3D Vector3D::kreuz(Vector3D& a, Vector3D& b)
    {


    mElement[Y] = a.mElement[Z]*b.mElement[X]-a.mElement[X]*b.mElement[Z];
    mElement[Z] = a.mElement[Y]*b.mElement[Z]-a.mElement[Z]*b.mElement[Y];

    return *this;
    }

    Dafür schimpf er jetzt wenn ich versuche die Funktion aufzurufen, und erzählt mir sie sei nicht definiert... 😕



  • warum willst du eigentlich einen vector zurückgeben????

    entweder

    void kreuz(

    und dann

    Vector3D c;

    c.kreuz(a,b);

    dann steht es in c drinnen, oder

    Vector3D kreuz(b)

    Vector a,b,c;

    c = a.kreiz(b);

    oder wie auch immer 😉



  • PS

    zeig mir mal die gesamte main fkt, damit ich sehe wie und mit was du versuchst aufzurufen



  • Ich will deshalb einen Vector zurückgeben, weil diese kleine Funktion später noch weiterverwendet werden soll, und weil meine Aufgabenstellung das auch so verlangt 😉

    #include <iostream>
    #include <stdlib.h>
    #include "Vector3D.h"

    using namespace std;

    int main(int argc, char *argv[])
    {

    Vector3D a(5, 3, 0);
    Vector3D b(-2, 4, 0);

    cout << "Vektor a: (" << a.x() << ", " << a.y() << ", " << a.z() << ")" << endl;
    cout << "Vektor b: (" << b.x() << ", " << b.y() << ", " << b.z() << ")" << endl;

    Vector3D c = kreuz(a,b);

    cout << "Kreuzprodukt: (" << c.x() << ", " << c.y() << ", " << c.z() << ")" << endl;

    system("PAUSE");
    return 0;
    }



  • meckert der hier?

    Vector3D c = kreuz(a,b);
    

    du hast schon den operanten überladen, oder? wenn nicht, dann kannst du nicht mit = zuweisen 🙄



  • also am allereinfachsten machst du einen weiteren konstruktor

    dann kannst du in der main

    Vektor3D a,b;
    ...

    Vektor3D c(a,b); machen

    aber ich glaub das verlangt die aufgabenstellung nicht.

    PS: http://www.math.uni-wuppertal.de/~axel/skripte/oop/oop13.html



  • newkid_ schrieb:

    du hast schon den operanten überladen, oder? wenn nicht, dann kannst du nicht mit = zuweisen

    Bei so einfachen Klassen (ohne dynamische Speicheranforderung) reicht der Default-Kopierkonstruktor. Hier ein Beispiel wie man das Kreuzprodukt innerhalb und ausserhalb der Klasse definieren kann.

    #include <iostream>
    
    using namespace std;
    
    template<typename T>
    class Vektor3
    {
        private:
    	T m_x, m_y, m_z;
    
        public:
    	Vektor3(T x, T y, T z): m_x(x), m_y(y), m_z(z) {}
    	Vektor3(T wert): m_x(wert), m_y(wert), m_z(wert) {}
    	Vektor3(): m_x(0), m_y(0), m_z(0) {}
    
    	inline T x() const { return m_x; };
    	inline T y() const { return m_y; };
    	inline T z() const { return m_z; };
    
    	static Vektor3<T> KreuzProdukt(const Vektor3<T> &v1, const Vektor3<T> &v2)
    	{
    	    return Vektor3<T>(
    		    v1.m_y*v2.m_z - v1.m_z*v2.m_y,
    		    v1.m_z*v2.m_x - v1.m_x*v2.m_z,
    		    v1.m_x*v2.m_y - v1.m_y*v2.m_x);
    	}
    };
    
    template<typename T>
    Vektor3<T> KreuzProduktVonAussen(const Vektor3<T> &v1, const Vektor3<T> &v2)
    {
        return Vektor3<T>(
    	    v1.y()*v2.z() - v1.z()*v2.y(),
    	    v1.z()*v2.x() - v1.x()*v2.z(),
    	    v1.x()*v2.y() - v1.y()*v2.x());
    }
    
    template<typename T>
    ostream &operator<<(ostream &ausgabe, const Vektor3<T> &v)
    {
        return ausgabe << "(" << v.x() << ", " << v.y() << ", " << v.z() << ")";
    }
    
    int main()
    {
        Vektor3<float> a(2,5,7), b(4,6,8), c, d;
    
        c = Vektor3<float>::KreuzProdukt(a,b);
        d = KreuzProduktVonAussen(a,c);
    
        cout << a << endl;
        cout << b << endl;
        cout << c << endl;
        cout << d << endl;
    
        cin.get();
    }
    

Anmelden zum Antworten