Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » GPS Koordinaten

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.02.2017, 19:50 Uhr
berolld



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:

Code:

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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.02.2017, 20:38 Uhr
Hans
Library Walker
(Operator)


Hi,

bei so langen Rechenausdrücken ist es oftmals sinnvoll die Berechnung in mehrere Teilschritte zu zerlegen, die in weiteren Variablen zwischengespeichert werden, ähnlich wie man sich Zwischenergebnisse notiert, wenn man die Berechnung mit 'nem Taschenrechner ohne Speicherfunktion durchführt. Dann kann man die Zwischenergebnisse entweder mit write oder cout oder was vergleichbarem ausgeben oder aber im Debugger beobachten, wo die Zwischenergebnisse noch richtig sind und wo nicht mehr. - Und vor allem kann man dann auch leichter (mit dem Taschenrechner) nachrechnen ob die Werte noch stimmen.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.02.2017, 21:31 Uhr
berolld



Hallo Hans,

Als erstes , entschuldigung für meine vielen Rechtschreibfehler im ersten Thread.

Und ja ich habe den Zwischnschritt eingebaut. Jetzt erhalte ich auch keine so enorm hohen Ergebnisse mehr.
Jedoch, bin ich mir nciht ganz sicher, ob der Code auch so arbeitet wie ich es haben möchte.
Ein kleines Beispiel:

Laufnummer Breite Länge

1 48.4844 7.89512
2 48.4844 7.89529
3 48.4845 7.89525
4 48.4845 7.89537
5 48.4846 7.89562
6 48.4846 7.89548
7 48.4846 7.89561
8 48.4845 7.89518
9 48.4846 7.89555
10 48.4845 7.89552
11 48.4846 7.89538
12 48.4845 7.89529
13 48.4844 7.89526

da müsste jetzt normalerweise ca. 70 m rauskommen.

Die Recnung soll ja so aussehen.

Die Werte aus 1 und die Werte aus zwei für die erste Strecke, diese zwischnspeichern.
Dann die Werte aus 2 und die Werte aus 3 für den nächsten Teilstreckenabschnitt, und wieder zwischnspeichern.
Dann Werte aus 3 und 4 für Teilstrecke und dann wieder zwischenspeichern usw.


Code:
    //als Globale Vectoren ...
std::vector<double>  breite ;
std::vector<double>  laenge ;
//.....
//füllen der Vectoren....
//...
double gesamtHoehe =0;
double strecke;  

double gesamtstrecke;  //<------Neu hinzugefügt

    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]));
      
     gesamtstrecke=gesamtstrecke+strecke;  //<--------Auch neu, um die Wert zwischenzuspeichern

    }
              
    gesamtstrecke = (strecke*PI)/180;
        //Die Strecke soll als ein komplettes Endergebniss dargestellt werden...
    write << gesamtstreckes<<std::endl;

    write.close();



Ich bin mir nicht sicher, ob er die Reihenfolge einhält wenn er auf die Werte zugreift, sprich immer einen Wert weitergeht.

Gruß

berolld

Dieser Post wurde am 11.02.2017 um 21:34 Uhr von berolld editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.02.2017, 22:58 Uhr
Hans
Library Walker
(Operator)


Hi,

ich hatte das eigentlich so gemeint, dass Du diesen Ausdruck:

C++:
strecke= R *acos(sin(breite[k])*sin(breite[k+1])+
                  cos(breite[k])*cos(breite[k+1])*cos(laenge[k+1]- /* ! */laenge[k]));

aufdröselst, so dass die Berechnung am Ende etwa so aussieht:

C++:
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 = cos(laenge[k+1]);
   double cl2 = cos(laenge[k]);

strecke= R *acos(s1*s2 + cb1*cb2*cl1 - cl2);
  ...



Und bist du sicher, dass Du an der Stelle, wo ich oben den C-Kommentar /* ! */ eingefügt habe, keinen Kosinus (oder Sinuns) vergessen hast? - Ich hab bei meiner Umformulierung der Berechnung jetzt einfach mal einen Kosinus eingefügt, aber keine Ahnung, ob das auch richtig ist. Aber da Du die vector-inhalte ansonsten auch alle mit Winkelfunktionen bearbeitest, scheint es mir eher ungewöhnlich, wenn da keine Winkelfunktion hin kommen sollte.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: