sin²(50)



  • S := sin²(50)cos²(1) + cos²(20)sin²(1)
    möchte ich in cpp schreiben.

    float c = pow(cos(50), 2) * pow(cos(1), 2) + pow(sin(20), 2) * pow(sin²(1), 2);
    

    ist falsch.

    Was bedeutet sin²(G)cos²(1)?

    vielen Dank schonmal...



  • <---> schrieb:

    float c = pow(cos(50), 2) * pow(cos(1), 2) + pow(sin(20), 2) * pow(sin²(1), 2);
    

    ist falsch.

    Dann nimm das "²" dahinten raus.



  • Danke!
    oh, hab falsch kopiert.

    aber so its auch noch falsch:

    float c = pow(cos(50), 2) * pow(cos(1), 2) + pow(sin(20), 2) *  pow(sin(1), 2);
    


  • Du hast cos und sin vertauscht!!!

    Außerdem arbeiten die C-Funktionen im Bogenmaß, d.h. wenn deine Werte Winkelangaben sind, dann muß du diese noch entsprechend anpassen:

    bogen = winkel * M_PI / 180;
    
    // Beispiel:
    
    y = sin(50 * M_PI / 180);
    


  • rechnest du in Gradmaß? Wenn ja, solltest du alle Werte mit pi/180 multiplizieren (C rechnet nämlich in Bogenmaß).



  • also hier ist die komplette Formel. Ich möchte möglichst genau den Abstand von 2 Koordinaten auf der Erde berechnen. (great distance war zu ungenau, daher versuche ich es jetzt mit dieser Formel. Soll laut wiki auf 50 meter genau sein.

    Beim debuggen sind ab S alle Werte falsch:

    float b1 = 52.5167f; //lat0; // alle Werte in rad 
     float  l1 = 13.40f; //lon0; 
     float  b2 = 35.70f; //lat1;
     float  l2  = 139.7667f; //lon1;    
    
     float  f = (1/298.257223563f);
     float a = 6378.14f;
    
     float F = (b1+b2)/2;
     float G = (b1-b2)/2;
     float l = (l1-l2)/2;
     //S := sin²(G)cos²(l) + cos²(F)sin²(l)
    
      float S = (pow(sin(G), 2)* pow( cos(1), 2)) + (pow(cos(F), 2) * pow(sin(1), 2));
    
      float C = pow(cos(G), 2) * pow(cos(1), 2) + pow(sin(F), 2) *  pow(sin(1), 2);
      float w = atan(sqrt(S/C));
      float R = sqrt(S*C)/w;
      float D = 2*w*a;
      float H1 = (3*R-1)/(2*C);
      float H2 = (3*R+1)/(2*S);
    
        dist = D*(1 + f*H1*pow(sin(F), 2) * pow(cos(G), 2) - f*H2*pow(cos(F), 2) * pow(sin(G), 2));
    

    vielen Dank!



  • Hast du den Hinweis mit dem Bogenmass beruecksichtigt?



  • ja hab ich.

    Die Werte für lat lon rechne ich um:

    const float DEG2RAD = 3.14159265f / 180.0f;
    

    vielen Dank und Grüsse



  • Ich hab das ganze auch mal gemacht... eigentlich muss man da nicht sp viel rechnen wie du. Oder wir reden von was verschidenem.
    Dieser Code berechnet die Distanz in Metern der angegebenen Punkte auf der Erdoverfläche

    // Radius ist Erdradius
    float Distance(const Position& A, const Position& B)
    	{
    		Position a = DegToRad(A);
    		Position b = DegToRad(B);
    		// e = ARCCOS[ SIN(Breite1)*SIN(Breite2) + COS(Breite1)*COS(Breite2)*COS(Länge2-Länge1) ]
    		double c = sin(double(a.lat))*sin(double(b.lat)) + cos(double(a.lat))*cos(double(b.lat))*cos(double(b.lon-a.lon));
    		//std::cout << "DIstance: cos = " << std::setprecision(15) << c << " float: " << float(c) << std::endl;
    		double ac = acos(c);
    		return Radius * ac;
    	}
    

    Das ganze wendet die Ortodromengleichung an:
    http://de.wikipedia.org/wiki/Orthodrome

    Ist allerdings die Annäherung wenn die Erde eine Kugel wäre.

    Vielleicht hilft dir das. Aber nimm auf alle Fälle für die Berechnungen doubles und keine floats, sonst geht wirklich Genauigkeit verloren bei unserer großen Erde 🙂



  • Ja, die Variante hab ich auch schon probiert. Sie war leider zu ungenau.

    Ich brauch ne Formel, wo der Radius der Erde genauer mit eingerechnet wird.
    Wenn die lat Werte ähnlich gross sind funktioniert es mit Deiner Formel super. Je weiter sie voneinder abweichen, je ungenauer wirds.



  • <---> schrieb:

    ja hab ich.

    Die Werte für lat lon rechne ich um:

    const float DEG2RAD = 3.14159265f / 180.0f;
    

    vielen Dank und Grüsse

    Und wo in dem Code dort oben steht diese Umrechnung? (Eine Angabe ala float b1 = 52.5167f erscheint mir ein wenig groß, um als Bogenmaß-Wert durchgehen zu können ;))



  • sinh()


Anmelden zum Antworten