Mit GPS Koordinaten arbeiten.



  • Hallo,

    ich arbeite zurzeit an einer App welche ich Erstellen wollte.
    Ich habe soweit die Breiten- und Längengrade ermittelt, über GPS.
    Diese ändern sich ja beim bewegen 😃 . Diese Werte schreibe ich über fstream in eine Datei.
    Ich würde jetzt gerne, die Strecke ermitteln die ich hingelegt habe, und diese am Ende der Aufzeichnung, am Ende der Datei anhängen.

    Ich habe etwas probiert, was an und für sich nicht machbar ist.

    double b=LocationSensor1->Sensor->Latitude;
    				 double l=LocationSensor1->Sensor->Longitude;
    				 double sum=0;
    
    				 while(b != b || l != l )
    				 {
    					 int a =0;
    					 a=b;
    					 b=b;
    
    					 int c =0;
    					 c=l;
    					 l=l;
    
    					 double ergebnis = 0;
    				 ergebnis = ergebnis + (acos(sin(a)*sin(b)+cos(a)*cos(b)*cos(c-l)));
    				 write<<ergebnis;
    				 }
    

    Ich wollte mit der while Schleife aunf die Veränderungen reagieren, und diese jedesmal wen eine Veränderung eintritt dich rechnung ermitteln lassen.

    Natürlich will ich nicht nur die Strecke über zwei Koordinaten ermitteln, sondern über die gesamte Strecke.

    Ich hoffe jemand versteht was mein Problem ist und kann mir weiter helfen.

    Danke im voraus!



  • while (b != b || l != l)
    

    Wann meinst du denn wird die Bedingung jemals erfüllt sein? 😉

    Du mußt dir die aktuellen Werte in einer Membervariablen merken und vorher jeweils die Strecke aus den aktuellen Werten und diesen vorherigen Werten ermitteln.



  • Die wird nie erfüllt, das ist ja mein Problem.

    🙄
    Wie geht das mit der Membervariablen.
    Ich wollte die Werte zuerst als Array abspeichern, dann darauf zugreifen...
    Jedoch hat das Array keine fest definiert Länge da ich nciht weis wieviele Werte aufgezeichnet werden, so dass ich ein weiters Problem habe...

    Hast du einen Ansatz für mich?


  • Mod

    Th69 schrieb:

    while (b != b || l != l)
    

    Wann meinst du denn wird die Bedingung jemals erfüllt sein? 😉

    Wenn wenigstens einer der beiden doubles NaN ist 🙂



  • Habe jetzt vollgendes gemacht!

    Ich schpeichere die Werte in ein Vector ab, diese verwende ich dann um meine Rechnung durchzuführen, jedoch hab eich irgendwo ein Fehler.
    Ich bekomme otopische Werte Raus.

    Hier mein Code:

    //als Globale Vectoren ...
    std::vector<double>  breite ;
    std::vector<double>  laenge ;
    //.....
    //füllen der Vectoren....
    //...
    double gesamtHoehe =0;
    double strecke =0;
    	for (int k=0; k < breite.size()-1; k++) {
    	strecke+= R *acos(sin(breite[k])*sin(breite[k+1])+
                      cos(breite[k])*cos(breite[k+1])*cos(laenge[k+1]-laenge[k]));
    
    	}
    
    	strecke = (strecke*PI)/180;
    	strecke = strecke*1000;
            //Die Strecke soll als ein komplettes Endergebniss dargestellt werden...
    	write << strecke<<std::endl; 
    
    	write.close();
    

    ich breuch den ersten und den zweiten Wert, danach muss das Ergebnis zwischengespeichert werden, danach brauche ich dern 2. und den 3. Wert, dieser muss zum vorherigen dazu addiert werden dann den 3. und den 4. Wert usw.

    Ich hoffe jemand kann mir sagen wo ich den fehler drin habe.

    Nach einem testlauf, habe ich bei Werten für normalerweise 300m distant 38756,39 Meher erhalten.



  • Bogenmaß.



  • Was meinst du damit?
    Ich habe ja durch

    strecke = (strecke*PI)/180;
    strecke = strecke * 1000;
    

    umgerechnet, und die angabe in meter gemacht.



  • sin() und cos() verlangen den Parameter im Bogenmaß.



  • Die Formel die ich hier habe gilt für die Angabe der Winkel in Radiant.

    Sie ist ja dafür gedacht, damit ich nicht in Bogenmaß rechnen muss.



  • Das ändert nix daran das die cos() und sin() Funktion den Eingabe Wert im Bogenmaß erwartet. Daher musst du deine Eingabe Werte vorher umrechnen.



  • Ok, wenn ich das dann richtig verstehe, muss ich wie hier angegeben http://www.frustfrei-lernen.de/mathematik/bogenmass-und-gradmass.html

    meine Werte umrechnen.

    Wie genau müsste ich das jetzt in meinem Code machen, wäre für jede Hilfe dankbar.

    [code]
    double gesamtstrecke =0;
    for (int k=0; k < breite.size()-1; k++) {

    double s1 = sin(breite[k]);
    double s2 = sin(breite[k+1]);
    double cb1 = cos(breite[k]);
    double cb2 = cos(breite[k+1]);
    double cl1 = laenge[k];
    double cl2 = laenge[k+1];
    double ccl = cos(cl2-cl1);

    strecke= R * acos(s1*s2+cb1*cb2*ccl);
    gesamtstrecke=gesamtstrecke+strecke;
    write<<gesamtstrecke<<std::endl;
    }



  • Wenn ich das richtig sehe, möchtest du doch nur jeweils die Entfernungen zwischen 2 Punkten aufsummieren?

    Bemüh' mal den ollen Pythagoras 🤡 .



  • Z.b so

    #include <math.h>
    ...
    
    double strecke =0;
       for (int k=0; k < breite.size()-1; k++) {
    			double s1 = sin(breite[k]/180.0 * M_PI);
    			double s2 = sin(breite[k+1] /180.0 * M_PI);
    			double cb1 = cos(breite[k]/180.0 *M_PI);
    			double cb2 = cos(breite[k+1]/180.0 * M_PI);
    			double cl1 = laenge[k]/180.0 *M_PI;
    			double cl2 = laenge[k+1]/180.0 * M_PI;
    			double ccl = cos(cl2-cl1);
    
    			strecke+= R * acos(s1*s2+cb1*cb2*ccl);
                            }
    			std::cout<<strecke<<std::endl;
    


  • dref schrieb:

    Bemüh' mal den ollen Pythagoras 🤡 .

    Der gilt aber nur bei einem ebenen Dreieck.



  • DirkB schrieb:

    dref schrieb:

    Bemüh' mal den ollen Pythagoras 🤡 .

    Der gilt aber nur bei einem ebenen Dreieck.

    Kann aber bei kurzen Distanzen trotzdem ausreichen 😉



  • Schlangenmensch schrieb:

    DirkB schrieb:

    dref schrieb:

    Bemüh' mal den ollen Pythagoras 🤡 .

    Der gilt aber nur bei einem ebenen Dreieck.

    Kann aber bei kurzen Distanzen trotzdem ausreichen 😉

    Ja, aber nur in der Gegend am Äquator.


Anmelden zum Antworten