Wuerfel
-
Hallo ich habe von meinen Lehrer die Aufgabe bekommen einen Würfel abzubilden und ihn dann drehen zu lassen. Nun ich habe damit jetzt angefangen und ich weiß momentan einfach nicht weiter. Erstmal mein Code.
//Vektor3D.h #ifndef VEKTOR3D_HPP #define VEKTOR3D_HPP #include <iostream> #include "Vektor2D.h" using namespace std; class Vektor3D { private: float x; float y; float z; public: Vektor3D(); Vektor3D(float x, float y, float z); Vektor3D operator-(const Vektor3D& a); Vektor3D operator+(const Vektor3D& a); float getX(); void setX(float x); float getY(); void setY(float y); void setXYZ(float x, float y, float z); void setXY(float x, float y); friend ostream& operator<<(ostream& os, const Vektor3D& a); }; #endif // VEKTOR_HPP//Vektor3D.cpp #include "Vektor3D.h" Vektor3D::Vektor3D() { x = 0; y = 0; z = 0; } Vektor3D::Vektor3D(float x, float y, float z) { this->x = x; this->y = y; this->z = z; } void Vektor3D::setX(float x) { this->x = x; } void Vektor3D::setY(float x) { this->y = y; } float Vektor3D::getX() { return x; } float Vektor3D::getY() { return y; } Vektor3D Vektor3D::operator+(const Vektor3D& a) { this->x += a.x; this->y += a.y; this->z += a.z; return *this; } Vektor3D Vektor3D::operator-(const Vektor3D& a) { this->x -= a.x; this->y -= a.y; this->z -= a.z; return *this; } ostream& operator<<(ostream& os, const Vektor3D& a) { os << a.x << " " << a.y << " " << a.z << endl; return os; } void Vektor3D::setXY(float x, float y) { this->x = x; this->y = y; } void Vektor3D::setXYZ(float x, float y, float z) { this->x = x; this->y = y; this->z = z; }//Wuerfel.h #ifndef WUERFEL_HPP #define WUERFEL_HPP #include "Vektor3D.h" class Wuerfel { private: int Verbindungen[24] = { 0,1 ,1,2 ,2,3 ,1,3, 4,5 ,5,6 ,4,7 ,6,7, 3,7 ,2,6 ,1,5 ,0,4 }; Vektor3D kanten[12]; Vektor3D vektoren[8]; void berechneKanten(); Vektor3D points[12]; void berechnePoints(); public: Wuerfel(); Vektor3D getPoint(int num); Vektor3D getKanten(int num); Vektor3D getVektoren(int num); }; #endif // WUERFEL_HPP /* Vektor übergabe Beachten A = 0 B = 1 C = 2 D = 3 E = 4 F = 5 G = 6 H = 7 *///Wuerfel.cpp #include "Wuerfel.h" void Wuerfel::berechneKanten() { int counter = 0; for (int i = 0; i<24; i = i + 2) { kanten[counter] = vektoren[Verbindungen[i]] - vektoren[Verbindungen[i + 1]]; counter++; } } void Wuerfel::berechnePoints() { points[0].setXY(vektoren[0].getX()*(-1), vektoren[0].getY()*(-1)); points[1].setXY(points[0].getX() + kanten[0].getX(), points[0].getY() + kanten[0].getY()); points[2].setXY(points[1].getX() + kanten[1].getX(), points[1].getY() + kanten[1].getY()); points[3].setXY(points[2].getX() + kanten[2].getX(), points[2].getY() + kanten[2].getY()); points[4].setXY(points[3].getX() + kanten[3].getX(), points[3].getY() + kanten[3].getY()); } Wuerfel::Wuerfel() { this->vektoren[0].setXYZ(-10, -10, -10); this->vektoren[1].setXYZ(10, -10, 10); this->vektoren[2].setXYZ(10, 10, -10); this->vektoren[3].setXYZ(-10, 10, -10); this->vektoren[4].setXYZ(-10, -10, 10); this->vektoren[5].setXYZ(10, -10, 10); this->vektoren[6].setXYZ(10, 100, 10); this->vektoren[7].setXYZ(-10, 10, 10); berechneKanten(); berechnePoints(); } Vektor3D Wuerfel::getPoint(int num) { return points[num]; } Vektor3D Wuerfel::getKanten(int num) { return kanten[num]; } Vektor3D Wuerfel::getVektoren(int num) { return vektoren[num]; }Ich habe mir gedacht ich errichte ein was ein dreidimensionalen Vektor repsäsentiert. Anschließend kann ich damit für den Würfel arbeiten. Jeder Vektor geht vom Mittelpunkt in eine Ecke, somit bekomme ich 8 Vektoren. Diese Vektoren übergebe ich dem Würfel als Array (hatt hier schon nicht geklappt deswegen die anderen Schreibweise im Konstruktor initialisiert). Mein Problem jetzt ist, dass er die Vektoren nichtmal richtig übernimmt wenn ich die Vektoren mittels cout ausgebe kommt nur bei dem Sechsten die richtigen Werte bei X,Y und Z raus. Bei dem Rest kommt immer irgendeine Falsche Zahl raus.
Könnt ihr mir da etwas helfen?Das ganze Zeichnen möchte ich mit SFML, und dem VertexArrays.
Mit freundlichen Grüßen
Theroth
-
Ich sehe kein cout
-
Alle couts stehen bei mir in der Main und ich gebe sie dort aus.
Okay ich habe sie gerade im Konstruktor ausgeben dort werden sie richtig angezeigt.code im Konstruktor unterhalb der Zuweisung
for (int i = 0; i < 8; i++) { cout << vektoren[i] << endl; }Hier ist meine Main auch noch mit den falschen Couts
#include <iostream> #include <SFML/Graphics.hpp> #include "Wuerfel.h" #include "Vektor3D.h" using namespace std; int main() { Wuerfel WuerfelObj; for (int i = 0; i < 8; i++) { cout << WuerfelObj.getVektoren(i) << endl; } sf::RenderWindow window(sf::VideoMode(800, 600), "SFML works!"); sf::CircleShape shape(100.f); shape.setFillColor(sf::Color::Green); while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); } window.clear(); window.display(); } return 0; }
-
Dann gib die Werte im Konstruktor auch noch jeweils nach
berechneKanten(); berechnePoints();aus.
-
Okay also die Vektoren ändern sich tatsächlich erst nach der berechneKanten() funktion. Aber wieso?
Ich weise keinen vektor einen neuen Wert zu.
-
Der Fehler lag offensichtlich in meiner Überladung zum - Operator da dort die Werte überschrieben wurden.
Habs ausgebessert danke vielmals!
Mit freundlichen Grüßen
Theroth
-
Ich bin grade sehr verwirrt und komm nicht weiter
In meiner Überladung:
Vektor3D Vektor3D::operator-(const Vektor3D& a) { Vektor3D c; c.setX(this->x - a.x); c.setY(this->y - a.y); c.setZ(this->z - a.z); return c; }Die jetzt soweit funktioniert für Positive Zahlen.
Wenn ich jetzt z.B. -100 und -100 habe kommt statt -200 nämlich 0 raus. Das klingt auch logisch erstmal wenn man sich anguckt wie das funktioniert.
this->x liefert dann -100
-100 -
dann kommt a.x dies liefert ebenfalls -100 also
-100 - (-100) = 0
Wie ändere ich das? Darüber habe ich mir irgendwie noch nie Gedanken gemacht es hatt immer so funktioniert. Liegt das jetzt an VisualStudio vorher CodeBlocks?
Mit freundlichen Grüßen
Theroth
-
Warum willst Du das ändern? Sagst doch selber, dass das das richtige Verhalten ist.
-
Ja im prinzip schon aber auch nur weil ich ja ein Operator angeben muss, der zwischen den beiden Variablen steht.
Eigentlich wäre es ja schon anders, da -100 -100 nicht 0 ist, aber ich das erste Minuszeichen nicht einfach weglassen kann.
Ich könnte so etwas wie -100 - |100| machen dann hätte ich immer den Betrag. Was mich stört ist, das ich das noch nirgends beachtet habe und auch mein Lehrer usw. da nie drauf eingegangen ist und zu letzt es stand auch nicht in Büchern.
Aber wäre meine Idee so richtig oder geht das auch mit einem Trick?
Mit Betrag geht aus natürlich auch nicht ist mir kurz danach aufgefallen, da er sonst immer abzieht und sich nicht mehr korrekt bei + verhält.
-
Es ist aber nicht anders. -100-(-100) ist nunmal 0. Anders würde es ja zu Problemen führen.
-
Theroth schrieb:
Eigentlich wäre es ja schon anders, da -100 -100 nicht 0 ist, aber ich das erste Minuszeichen nicht einfach weglassen kann.
Das ist dann aber -100**
+**(-100). Und - oh Wunder - Dein op+ macht dann auch genau das richtige. (Vorausgesetzt, Du hast ihn analog zum op- gefixed)Oder aber -100**
-**100. Und auch da ist alles in Ordnung.