Klasse Addition von Koordinaten



  • Servus Leute, meine Aufgabe ist ein Saugroboter zu programmieren, der von der einen Stelle zu der nächsten Stelle fährt. Mein Problem ist das mein Programm nicht die alten Koordinaten mit dein neuen Koordinaten addiert.
    Der Winkel(Angle) addiert richtig, aber gehört wahrscheinlich nicht in die turn-Methode.
    Vielen Dank im voraus.
    Ist mein erster Beitrag, bitte um Verständnis.😇
    Header:

    #ifndef CROBOT_H_
    #define CROBOT_H_
    
    class CRobot {
    	float m_shape;
    		 double m_xPos;
    		 double m_yPos;
    		 double m_angle;
    		 double m_route;
    
    
    public:
    	CRobot();
    	virtual ~CRobot();
    	double getXPos(double);
    	double getYPos();
    	double getAngle();
    	void turn(double angle);
    	void drive(double route);
    	void showPos();
    
    };
    
    #endif /* CROBOT_H_ */
    
    

    CPP-Datei:

    #include "CRobot.h"
    #include <cmath>
    #include <iostream>
    #define _USE_MATH_DEFINES
    using namespace std;
    CRobot::CRobot() {
    	// TODO Auto-generated constructor stub
    	 m_shape=0;
    	 m_xPos=0;
    	 m_yPos=0;
    	 m_angle=0;
    	 m_route=0;
    }
    
    CRobot::~CRobot() {
    	// TODO Auto-generated destructor stub
    
    }
    
    void CRobot::turn(double angle) {
    if(m_angle==0){
    		m_angle = angle;
    }
    else{
    			m_angle = m_angle+ angle;
    		}
    }
    
    void CRobot::drive(double route){
    	m_route = route;
    
    
    }
    
    void CRobot::showPos() {
    	cout << "X-Position = " << getXPos(m_xPos) << endl;
    	cout << "Y-Position = " << getYPos() << endl;
    	cout << "Winkel in Grad(Radianten) = " << (360/(2*M_PI))*getAngle() << " ("<<getAngle()<<")" << endl;
    }
    
    
    double CRobot::getXPos(double XPos) {
    	m_xPos = XPos;
    	if(m_xPos==0){
    		m_xPos=m_route*(cos(m_angle));
    	}
    	else{
    		m_xPos=m_route*(cos(m_angle));
    				m_xPos = m_xPos+ XPos;
    			}
    	return m_xPos;
    }
    
    double CRobot::getYPos() {
    	if(m_yPos!=0){
    		m_yPos=m_route*(sin(m_angle));
    		 m_yPos=m_yPos + m_yPos;
    
    
    	}else{
    		m_yPos=m_route*(sin(m_angle));
    
    
    	}
    	return m_yPos;
    }
    
    
    double CRobot::getAngle() {
    
    	return m_angle;
    }
    
    

    Main:

    #include <iostream>		// Header für die Standard-IO-Objekte (z.B. cout, cin)
    #include <stdlib.h>
    // TODO: Fügen Sie hier weitere benötigte Header-Dateien ein
    #define _USE_MATH_DEFINES
    #include <cmath>
    using namespace std;	// Erspart den scope vor Objekte der
    						// C++-Standard-Bibliothek zu schreiben
    						// z.B. statt "std::cout" kann man "cout" schreiben
    
    // Inkludieren Sie die Header-Datei Ihrer Klasse
    #include "CRobot.h"
    
    // Hauptprogramm
    // Dient als Testrahmen, von hier aus werden die Klassen aufgerufen
    int main (void)
    {
        // TODO: Fügen Sie ab hier Ihren Programmcode ein
    	cout << "CleanerBot gestarted." << endl << endl;
    	CRobot test;
    		test.showPos();
    		test.turn(M_PI/2);
    		test.drive(1);
    		test.showPos();
    		test.turn(-M_PI/3);
    		test.drive(1);
    		test.showPos();
    		test.turn(M_PI/3);
    		test.drive(1);
    		test.showPos();
    
    	return 0;
    }
    

  • Mod

    Es gibt ja gar keinen Code, der irgendetwas bezüglich der Koordinaten ändern würde. Was wundert dich dann daran, dass diese sich nicht ändern? Oder anders gesagt: Von welcher Stelle in deinem Code erwartest du, dass sie das tut, was du vermisst?

    Ansonsten: Es gibt in deinem Code derzeit schwere Mängel, sowohl bezüglich der Modellierung, als auch bezüglich der technischen Umsetzung, als auch bezüglich des Stils. Wenn du diese behebst, lösen sich viele Probleme wahrscheinlich von alleine, oder die Problemstellen fallen stärker auf. Da das eine längere Liste wird, verschiebe ich Details auf einen späteren Beitrag.


  • Mod

    Stilistische Mängel

    • Die Einrückung ist zufallsverteilt. Hast du keinen Editor, der automatisch korrekt einrückt? Einrückung hilft sehr bei der Lesbarkeit. Lesbarkeit hilft sehr bei der Fehlersuche. Wenn du keine automatische Einrückung hast, musst du unbedingt mehr Selbstdisziplin aufbringen.
    • Ungarische Notation ist sowas von 1975. Und war schon damals von zweifelhaftem Nutzen (wegen falsch verstandener Umsetzung). Die m_ kannst du meinetwegen lassen, aber so etwas wie das C vor allen Klassen ist einfach nur Quatsch.
    • int main (void). Ist zwar nur eine Kleinigkeit, aber zeigt, dass da jemand nicht korrekt C++ gelernt hat, wenn er denkt, da muss ein void hin.
    • camelCase für Funktionsnamen ist ungewöhnlich. Ist zwar einerseits sehr gut, dass du konsequent einen Stil durchziehst, aber andererseits kannst du dir als Anfänger auch gleich die üblichen Styleguides für C++ angewöhnen.

    Technische Mängel

    • Stichwort "const correktness": Nachschlagen, verstehen, umsetzen!
    • Stichwort "special member functions": Nachschlagen, verstehen, umsetzen!
    • Dass du stdlib.h einbindest ist zwar nur eine Kleinigkeit, aber zeigt, dass da jemand nicht korrekt C++ gelernt hat.

    Modellierungsmängel

    • Dein getXPos setzt die X-Position!
    • Beide deine Positionsgetter berechnen und ändern irgendetwas! Soll das vielleicht in drive rein?
    • Das Modell, dass ein Roboter eine Verbindung aus einer Form, einer Position, und einer Richtung ist, ist fragwürdig. Würdest du das als essentielle Funktionalität eines Roboters im echten Leben ansehen? Besser wäre, den ganzen Koordinatenkram in eine eigene Klasse auszulagern, die dann nur die eine Aufgabe hat, die Positionsberechnungen korrekt umzusetzen.


  • @Developer123 sagte in Klasse Addition von Koordinaten:

    void CRobot::turn(double angle) {
    if(m_angle==0){
    		m_angle = angle;
    }
    else{
    			m_angle = m_angle+ angle;
    		}
    }
    

    c = a + b mit a != 0
    -> c = a + b

    c = a + b mit a = 0
    -> c = a + b

    void CRobot::turn(double angle)
    {
        m_angle += angle;
    }
    


  • @Swordfish sagte in Klasse Addition von Koordinaten:

    c = a + b mit a != 0
    -> c = a + b

    c = a + b mit a = 0
    -> c = a + b

    Richtig. Aber bei einem Winkel könnte man allenfalls darüber nachdenken, diesen in den Bereich [0°, 360°[ oder [-180°, 180°[ zu bringen. In diesem Zusammenhang: Mit angle wird normalerweise Grad assoziiert. Du hast hier aber Bogenmaß. Ich würde die Variable dann anders nennen, z.B. arg (von "Argument" bei komplexen Zahlen) oder radians.

    Übrigens würde ich sowas hier: (360/(2*M_PI))*getAngle() unbedingt als Funktion schreiben: radToDeg(getAngle()) oder als Konstante: getAngle() * radToDeg. Das liest sich leichter. Aber auch hier: ich würde eigentlich erwarten, von getAngle Grad zurückzubekommen. Strong typing is was tolles...



  • @SeppJ
    Danke für die schnelle Antwort.
    Leider ist dieser "Stil" Vorgabe an meiner Uni und sind noch am Anfang von Klassen.
    Also soll ich versuchen in der drive-Methode die Werte von X und Y zu ändern?
    Wie könnte man sowas programmieren, das z.B. alter X-Wert + neuer X-Wert = neuer X-Wert ist? Bzw. wie könnte ich das hinbekommen, dass der alte wert nicht überschrieben wird?

    Vielen Dank im Voraus.


  • Mod

    Das macht ja nicht einmal auf Deutsch für einen Menschen nach 2x Lesen Sinn (alter X-Wert + neuer X-Wert = neuer X-Wert => alter X-Wert = 0), wie soll das für einen Computer verständlich sein? Ordne deine Gedanken! Was willst du machen?

    Ansonsten: Was richtig ist oder nicht, hängt erst einmal davon ab, was du erreichen möchtest. Mir ist das gesamte Design suspekt, daher wage ich nicht zu spekulieren, was wohl "richtig" sein könnte. Ich habe sogar eher den starken Verdacht, dass du hier völlig auf dem Holzweg bist. Kommt halt drauf an, was genau die Aufgabe ist. Hinter "Saugroboter programmieren" würde ich jedenfalls andere Anforderungen vermuten, als die Richtung, in die es derzeit geht. Beispiel: Ist die Umgebung nicht ziemlich wichtiger Teil eines solchen Modells? Davon ist nichts zu erkennen. Derzeit erinnert die Designrichtung eher an Turtle Grafik.

    An einer Hochschule darf man übrigens auch eigenständiges Denken zeigen und sich von Vorlagen entfernen.



  • Konnte mein Problem lösen.
    Danke für die Hilfe.



  • @Developer123 sagte in Klasse Addition von Koordinaten:

    Konnte mein Problem lösen.

    👍🏻 👍🏻 👍🏻



  • Vlt. kannst du ja die Lösung des Problem hier auch kurz darlegen für den nächsten der danach sucht und den Thread findet?


Anmelden zum Antworten