Funkcje i wskazniki (Algorytmy Kivjoja,vincentego i gaussa)

Odpowiedz Nowy wątek
2014-12-28 15:30
0

Witam wszystkich, mam problem z poniższym programem.
Program ma za zadanie liczyć algorytm Kivjoja (funkcja main()), a następnie na podstawie uzyskanych danych ma przeprowadzić sprawdzenie: za pomocą switch do wyboru Vincent i Gauss. Mam problem z wgraniem danych do funkcji Vincentego i Gaussa, ponieważ cześć danych jest zapisywana w tablicach używam wskaźników const double. Jako, że dopiero zaczolem się uczyć funkcji + wskaźniki pewnie robię gdzieś durny błąd ale nie mam pojęcia gdzie.

//Kivjoj.cpp
#include<iostream>
#include<math.h>
 
void showmenu();
double vincenty(const double * Fipp, const double * Fipk, const double * lambdapk, const double * lambdapp);
double gauss (const double *Fippp, const double *Fipkk, const double *lambdapkk, const double *lambdappp, const double N);
 
int main()
{
    using namespace std;
    double Fip[100];
    double lambdap[100];
    double SAB;
    double Aab[100];
    double a = 6378137;
    double b = 6356752.3;
    double e = 0.0066943800229;
 
    cout << "Podaj dane w [rad]: " << endl;
    cout << "Fip = ";
    cin >> Fip[0];
    cout << "Lambdap = ";
    cin >> lambdap[0];
    cout << "Sab = ";
    cin >> SAB;
    cout << "Azymut Aab = ";
    cin >> Aab[0];
// Punkt I. Dzielimy całą długość linii geodezyjnej s na n elementów ds. 
 
    cout << "Pkt I. Dzielimy cala dlugosc linii geodezyjnej s na n elementow ds" << endl;
    int podzial;
    cout << "Podaj liczbe odcinkow: ";
    cin >> podzial;
    double ds;
    ds = SAB / podzial;
    cout << "Odcinek ds = " << ds;
 
    // Początek petli Kivjoj'a
    int i;
    int coute = 0;
    double x;
 
    double M;
    double Mmi;
 
    double N;
    double Nmi;
 
    double pAmi[100];
    double Ami[100];
 
    double FFi1;
    double Fim[100];
 
    double pierwiastek;
    double pierwiastekm;
 
    double Yi[100];
    double Li[100];
    double Ai[100];
 
    for(i = 0; i < podzial; ++i)
    {
    // Obliczam M i N;
        pierwiastek =  sqrt(1 - ( e * sin(Fip[i]) * sin(Fip[i])));
        N = a/pierwiastek;
        M = (1-e)* N;
    //Obliczam pierwszy przyrost 
        FFi1 = (ds * (cos(Aab[i])) / M);
        cout << endl <<  i<<": "<<(FFi1)/2<<" = "<<FFi1<<" / 2;"<<endl;
        Fim[i] = Fip[i] + (FFi1/2.000);     // Tu mam problem
    // Obliczam Mmi i Nmi
        pierwiastekm =  sqrt(1 - ( e * sin(Fim[i])*sin(Fim[i])));
        Nmi = (a) / (pierwiastekm);
        Mmi = (1-e)*Nmi;
    // Obliczam Ami
        pAmi[i] = ( ds * (sin(  Aab[i])) * (tan(  Fim[i]))) / (Nmi);
        Ami[i] = Aab[i] + (0.5 * pAmi[i]);
    //Obliczam dla elemntu ds
        // Obliczam Yi
        Yi[i] = ( ds * (cos( Ami[i])) ) / Mmi;
        // Obliczam Li
        Li[i] = ( ds * (sin( Ami[i]))) / ( Nmi * (cos(Fim[i])));
        // Obliczam Ai
        Ai[i] = ((ds * (sin( Ami[i]))) * (tan( Fim[i]))) /( Nmi);
    // Kończenie pęteli dane pkt 2.
        //Obliczam Fip[1]
        Fip[i+1] = Fip[i] + Yi[i];
        //Obliczam lambdap[1]
        lambdap[i+1] = lambdap[i] + Li[i];
        //Obliczam Aab[1]
        Aab[i+1] = Aab[i] + Ai[i];
 
        coute++;
 
    }
    cout << endl;
    cout << "Podaje wyniki: " << endl;
    cout << "Liczba powtorzen petli: " << coute++ << endl;
    cout.precision( 11 );
    cout << "Podaje wyniki pośrednie z ostatniego przejscia: " << "M = " << M << " N = " << N << " FFi1 = " << FFi1 << endl;
    cout << " Fim = " << Fim[i] << " Mmi = " << Mmi << " Nmi = " << Nmi << " pAmi = " << pAmi[i];
    cout << " Ami = " << Ami[i] << endl;
    cout << fixed;
    cout.precision(11);
    cout << "Podaje wyniki posrednie: " << "B = " << Yi[podzial-1] << " L = " << Li[podzial-1] << " A = " << Ai[podzial-1] << endl;
    cout << "Fip = " << Fip[podzial] << endl;
    cout << "Lambdap = " << lambdap[podzial] << endl;
    cout << "Aab = " << Aab[podzial] << endl;
    cout << endl;
    cout << endl;
 
    cin.clear();
    cout << "Wybierz metode sprawdzenia." << endl;
    showmenu();
    int choice;
    cin >> choice;
    while (choice != 3)
    {
        switch(choice)
        {
        case 1 : vincenty (Fip, Fip + podzial, lambdap + podzial, lambdap); // wskazniki - Fip + podział powinno równac sie Fip[podzial] a Fip = Fip[0] i tak samo z lambdap i lampda p + podzial
                 break;
        case 2 : gauss (Fip, Fip + podzial, lambdap + podzial, lambdap,N); // wskazniki Fip + podział powinno równac sie Fip[podzial]
                 break;
        default : cout << "Nie ma takiej opcji" << endl;
        }
        showmenu();
        cin >> choice;
    }
 
    cout << endl;
    system("pause");
    return 0;
}
 
void showmenu()
{
    using namespace std;
    cout << "1) Algorytm Vincenty" << endl << "2) Srednia szerokosc Gaussa" << endl << "3) koniec";
}
 
double vincenty(const double *Fippp, const double *Fipkk, const double *lambdapkk, const double *lambdappp)
{
 
    using namespace std;
    const double *lambdapk = lambdapkk, *lambdapp = lambdappp, *Fipp, *Fipk;
    Fipp = Fippp;
    Fipk = Fipkk;
    cout << "1) Algorytm Vincenty" << endl;
    //dane z cz. 1
    double e = 0.0066943800229;
    double b = 6356752.314140;
    double f = 0.003352810681183;
    double L =  *lambdapk - (*lambdapp);
    //punkt 1
    double tan1 = (1-f) * tan(*Fipp), cos1 = 1 / sqrt((1 + tan1*tan1)), sin1 = tan1 * cos1;
    //punkt 2
    double tan2 = (1-f) * tan(*Fipk), cos2 = 1 / sqrt((1 + tan2*tan2)), sin2 = tan2 * cos2;
    //zmienne stworzone w trackie. 
    double Lambda = L, Lambdaprim, Limit = 50;
    double cosSAl, sin3, sinLambda, Sigma;
    double cos2M, cos3, cosLambda;
    do
    {
    double sinLambda = sin(Lambda), cosLambda = cos(Lambda);
    double sinS = (cos2*sinLambda) * (cos2*sinLambda) + (cos1*sin2-sin1*cos2*cosLambda) * (cos1*sin2-sin1*cos2*cosLambda);
    double sin3 = sqrt(sinS);
    double cos3 = sin1*sin2 + cos1*cos2*cosLambda;
    double Sigma = atan2(sin3, cos3);
    double sinAl = cos1 * cos2 * sinLambda / sin3;
    double cosSAl = 1 - sinAl*sinAl;
    double cos2M = cos3 - 2*sin1*sin2/cosSAl;
    double C = f/16*cosSAl*(4+f*(4-3*cosSAl));
    Lambdaprim = Lambda;
    Lambda = L + (1-C) * f * sinAl * (Sigma + C*sin3*(cos2M+C*cos3*(-1+2*cos2M*cos2M)));
    } while (abs(Lambda-Lambdaprim) > 0.000000000001 && --Limit > 0);
 
    double u = cosSAl * e;
    double A = 1 + u/16384*(4096+u*(-768+u*(320-175*u)));
    double B = u/1024 * (256+u*(-128+u*(74-47*u)));
    double ΔSigma = B*sin3*(cos2M+B/4*(cos3*(-1+2*cos2M*cos2M)- B/6*cos2M*(-3+4*sin3*sin3)*(-3+4*cos2M*cos2M)));
 
    double s = b*A*(Sigma-ΔSigma);
 
    double A1 = atan2(cos2*sinLambda,  cos1*sin2-sin1*cos2*cosLambda);
    double A2 = atan2(cos1*sinLambda, -sin1*cos2+cos1*sin2*cosLambda);
 
    cout << fixed;
    cout.precision(11);
    cout << "Wyniki: " << endl << "S = " << s << endl << "A1 = " << A1 << "A2 = " << A2 << endl;
 
    return 0;
}
 
double gauss (const double *Fippp, const double *Fipkk, const double *lambdapkk, const double *lambdappp, const double N)
{
    using namespace std;
    cout << "2) Srednia szerokosc Gaussa" << endl;
    //stale
    double e = 0.0066943800229;
    double b = 6356752.314140;
    double f = 0.003352810681183;
    double u = log(e);
    //dane
    const double *lambdapk = lambdapkk, *lambdapp = lambdappp, *Fipp, *Fipk;
    Fipp = Fippp;
    Fipk = Fipkk;
    double L =  *lambdapk - (*lambdapp);
    double F = *Fipp - *Fipk;
    double sFi = (*Fipp + *Fipk)/2;
    double cos1 =  cos(sFi);
    double sin1 = sin(sFi);
 
    double ssinA, scosA, dA, raz, dwa, trzy, cztery, piec, szesc, siedem, osiem, V, n, t;
    double s, A, tgA;
 
    V = 1 + e*e*cos1*cos1;
    t = tan(sFi);
    n = e*e*cos1*cos1;
 
    raz = 1 / ((1-e)* N);
    dwa = 1 / N;
    trzy = u/24;
    cztery = (u/(24*V*V))*(1+n-9*n*t*t);
    piec = trzy*(2+3*t*t+2*n);
    szesc = (u*n/(8*V*V))*(t*t-1-n-4*n*t*t);
    siedem = (u*V)/12;
    osiem = (trzy/(V*V))*(3+8*n+5*n*n);
 
    ssinA = (L/dwa)*cos1*(1 - ((trzy/u)*L*L*sin1*sin1) + ((u/cztery)*L*L));
    scosA = (F/raz)*(1 - ((piec/u)*F*F*cos1*cos1) -((szesc/u)*F*F));
    dA = L*sin1*(1 + (siedem/u)*L*L*cos1*cos1 + (osiem/u)*F*F);
 
    double pdA = 0.5 * dA;
    s = sqrt((ssinA * ssinA) + (scosA+scosA));
    tgA = (ssinA/scosA);
    A = atan(tgA);
 
    cout << fixed;
    cout.precision(11);
    cout << "Wyniki : " << endl << "s = " << s << endl << "A12 = " << (A - pdA) * 180 / 3.14159265 << endl << "A21 = " << (A + pdA) * 180 / 3.14159265 << " +/- 180st" << endl;
    return 0.0;
}
edytowany 1x, ostatnio: Argonus, 2014-12-28 17:51

Pozostało 580 znaków

2014-12-28 21:34
0

Zmieniłem kod ale pozostały mi nadal pare pytań.

  1. Zrobiłem kopiuj wklej kod do innego pliku, nowego i po wprowadzeniu tych samych danych pokazał mi inne wyniki o.O
  2. Zmieniłem w funkcji gauss() niektóre dane, np. u względem poprzedniej ale funkcja pokazuje mi cały czas identyczne wyniki jak przednio, tj nie zarejestrowała zmiany u.
  3. Algorytm kivjoja z funkcji main() pokazuje mi trochę inny wynik jak MSoffice excel ale do przyjęcia wiec to nie takie ważne.
  4. To jak mam zrobić, żeby funkcja brała daną fip[podział] tj ostatnią daną obliczana przez pętle for.
//Kivjoj.cpp
#include<iostream>
#include<math.h>
 
void showmenu();
void vincenty(const double *Fipp, const double *Fipk, const double *lambdapk, const double *lambdapp);
void gauss (const double *Fippp, const double *Fipkk, const double *lambdapkk, const double *lambdappp, const double N);
 
int main()
{
    using namespace std;
    double Fip[100];
    double lambdap[100];
    double SAB;
    double Aab[100];
    double a = 6378137;
    double b = 6356752.3;
    double e = 0.0066943800229;
 
    cout << "Podaj dane w [rad]: " << endl;
    cout << "Fip = ";
    cin >> Fip[0];
    cout << "Lambdap = ";
    cin >> lambdap[0];
    cout << "Sab = ";
    cin >> SAB;
    cout << "Azymut Aab = ";
    cin >> Aab[0];
// Punkt I. Dzielimy całą długość linii geodezyjnej s na n elementów ds. 
 
    cout << "Pkt I. Dzielimy cala dlugosc linii geodezyjnej s na n elementow ds" << endl;
    int podzial;
    cout << "Podaj liczbe odcinkow: ";
    cin >> podzial;
    double ds;
    ds = SAB / podzial;
    cout << "Odcinek ds = " << ds;
 
    // Początek petli Kivjoj'a
    int i;
    int coute = 0;
 
    double M;
    double Mmi;
 
    double N;
    double Nmi;
 
    double pAmi[100];
    double Ami[100];
 
    double FFi1;
    double Fim[100];
 
    double pierwiastek;
    double pierwiastekm;
 
    double Yi[100];
    double Li[100];
    double Ai[100];
 
    for(i = 0; i < podzial; ++i)
    {
    // Obliczam M i N;
        pierwiastek =  sqrt(1 - ( e * sin(Fip[i]) * sin(Fip[i])));
        N = a/pierwiastek;
        M = (1-e)* N;
    //Obliczam pierwszy przyrost 
        FFi1 = (ds * (cos(Aab[i])) / M);
        Fim[i] = Fip[i] + (FFi1/2.000);     
    // Obliczam Mmi i Nmi
        pierwiastekm =  sqrt(1 - ( e * sin(Fim[i])*sin(Fim[i])));
        Nmi = (a) / (pierwiastekm);
        Mmi = (1-e)*Nmi;
    // Obliczam Ami
        pAmi[i] = ( ds * (sin(  Aab[i])) * (tan(  Fim[i]))) / (Nmi);
        Ami[i] = Aab[i] + (0.5 * pAmi[i]);
    //Obliczam dla elemntu ds
        // Obliczam Yi
        Yi[i] = ( ds * (cos( Ami[i])) ) / Mmi;
        // Obliczam Li
        Li[i] = ( ds * (sin( Ami[i]))) / ( Nmi * (cos(Fim[i])));
        // Obliczam Ai
        Ai[i] = ((ds * (sin( Ami[i]))) * (tan( Fim[i]))) /( Nmi);
    // Kończenie pęteli dane pkt 2.
        //Obliczam Fip[1]
        Fip[i+1] = Fip[i] + Yi[i];
        //Obliczam lambdap[1]
        lambdap[i+1] = lambdap[i] + Li[i];
        //Obliczam Aab[1]
        Aab[i+1] = Aab[i] + Ai[i];
 
        coute++;
 
    }
    cout << endl;
    cout << "Podaje wyniki: " << endl;
    cout << "Liczba powtorzen petli: " << coute++ << endl;
    cout.precision( 11 );
    /*cout << "Podaje wyniki pośrednie z ostatniego przejscia: " << "M = " << M << " N = " << N << " FFi1 = " << FFi1 << endl;
    cout << " Fim = " << Fim[i] << " Mmi = " << Mmi << " Nmi = " << Nmi << " pAmi = " << pAmi[i];
    cout << " Ami = " << Ami[i] << endl;*/
    cout << fixed;
    cout.precision(10);
    cout << "Podaje wyniki posrednie: " << "B = " << Yi[podzial-1] << " L = " << Li[podzial-1] << " A = " << Ai[podzial-1] << endl;
    cout << "Fip = " << Fip[podzial] << endl;
    cout << "Lambdap = " << lambdap[podzial] << endl;
    cout << "Aab = " << Aab[podzial] << endl;
    cout << endl;
    cout << endl;
 
    cin.clear();
    cout << "Wybierz metode sprawdzenia." << endl;
    showmenu();
    int choice;
    cin >> choice;
    while (choice != 3)
    {
        switch(choice)
        {
        case 1 : vincenty (Fip, Fip + podzial, lambdap + podzial, lambdap); // wskazniki.
                 break;
        case 2 : gauss (Fip, Fip + podzial, lambdap + podzial, lambdap,N); // wskazniki
                 break;
        default : cout << "Nie ma takiej opcji" << endl;
        }
        showmenu();
        cin >> choice;
    }
 
    cout << endl;
    system("pause");
    return 0;
}
 
void showmenu()
{
    using namespace std;
    cout << "1) Algorytm Vincenty" << endl << "2) Srednia szerokosc Gaussa" << endl << "3) koniec" << endl;
}
 
void vincenty(const double *Fippp, const double *Fipkk, const double *lambdapkk, const double *lambdappp)
{
 
    using namespace std;
    const double *lambdapk = lambdapkk, *lambdapp = lambdappp, *Fipp, *Fipk;
    Fipp = Fippp;
    Fipk = Fipkk;
    cout << "1) Algorytm Vincenty" << endl;
    //dane z cz. 1
    double e = 0.0066943800229;
    double b = 6356752.314140;
    double f = 0.003352810681183;
    double L =  *lambdapk - (*lambdapp);
    //punkt 1
    double tan1 = (1-f) * tan(*Fipp), cos1 = 1 / sqrt((1 + tan1*tan1)), sin1 = tan1 * cos1;
    //punkt 2
    double tan2 = (1-f) * tan(*Fipk), cos2 = 1 / sqrt((1 + tan2*tan2)), sin2 = tan2 * cos2;
    //zmienne stworzone w trackie. 
    double Lambda = L, Lambdaprim, Limit = 50;
    double sinLambda = 0, cosLambda = 0;
    double sinS = 0, sin3 = 0, Sigma = 0, sinAl = 0;
    double cos3 = 0, cosSAl = 0, cos2M = 0, C =0;
 
    do
    {
    sinLambda = sin(Lambda), cosLambda = cos(Lambda);
    sinS = (cos2*sinLambda) * (cos2*sinLambda) + (cos1*sin2-sin1*cos2*cosLambda) * (cos1*sin2-sin1*cos2*cosLambda);
    sin3 = sqrt(sinS);
    cos3 = sin1*sin2 + cos1*cos2*cosLambda;
    Sigma = atan2(sin3, cos3);
    sinAl = cos1 * cos2 * sinLambda / sin3;
    cosSAl = 1 - sinAl*sinAl;
    cos2M = cos3 - 2*sin1*sin2/cosSAl;
    C = (f/16)*cosSAl*(4+f*(4-3*cosSAl));
    Lambdaprim = Lambda;
    Lambda = L + (1-C) * f * sinAl * (Sigma + C*sin3*(cos2M+C*cos3*(-1+2*cos2M*cos2M)));
    } while ((Lambda-Lambdaprim) > 0.000000000001 && --Limit > 0);
 
    double u = cosSAl * e;
    double A = 1 + u/16384*(4096+u*(-768+u*(320-175*u)));
    double B = u/1024 * (256+u*(-128+u*(74-47*u)));
    double dSigma = B*sin3*(cos2M+(B/4)*(cos3*(-1+2*cos2M*cos2M)- (B/6)*cos2M*(-3+4*cos2M*cos2M)));
 
    double s = b*A*(Sigma-dSigma);
 
    double A1 = atan2(cos2*sinLambda,  cos1*sin2-sin1*cos2*cosLambda);
    double A2 = atan2(cos1*sinLambda, -sin1*cos2+cos1*sin2*cosLambda);
    double AA1, AA2;
 
    if(cos2*sinLambda > 0 && cos1*sin2-sin1*cos2*cosLambda > 0)
        AA1 = A1;
    else if(cos2*sinLambda > 0 && cos1*sin2-sin1*cos2*cosLambda < 0)
        AA1 = 3.14159265359 - A1;
    else if(cos2*sinLambda < 0 && cos1*sin2-sin1*cos2*cosLambda < 0)
        AA1 = A1 + 3.14159265359;
    else
        AA1 = 2 * 3.14159265359 - A1;
 
    if(cos2*sinLambda > 0 && -sin1*cos2+cos1*sin2*cosLambda > 0)
        AA2 = A2;
    else if(cos1*sinLambda > 0 && -sin1*cos2+cos1*sin2*cosLambda < 0)
        AA2 = 3.14159265359 - A2;
    else if(cos1*sinLambda < 0 && -sin1*cos2+cos1*sin2*cosLambda < 0)
        AA2 = A2 + 3.14159265359;
    else
        AA2 = 2 * 3.14159265359 - A2;
 
    cout << fixed;
    cout.precision(11);
    cout << "Wyniki: " << endl << "S = " << s << endl << "A1 = " << AA1 << endl << "A2 = " << AA2 << endl;
 
}
 
void gauss (const double *Fippp, const double *Fipkk, const double *lambdapkk, const double *lambdappp, const double N)
{
    using namespace std;
    cout << "2) Srednia szerokosc Gaussa" << endl;
    //stale
    double e = 0.0066943800229;
    double b = 6356752.314140;
    double f = 0.003352810681183;
    double u = 0.4342944819;
    //dane
    const double *lambdapk = lambdapkk, *lambdapp = lambdappp, *Fipp, *Fipk;
    Fipp = Fippp;
    Fipk = Fipkk;
    double L =  *lambdapk - (*lambdapp);
    double F = *Fipk - *Fipp;
    double sFi = (*Fipp + *Fipk)/2;
    double cos1 = cos(sFi);
    double sin1 = sin(sFi);
 
    double ssinA, scosA, dA, raz, dwa, trzy, cztery, piec, szesc, siedem, osiem, V, n, t;
    double s, A, tgA;
 
    V = 1 + e*cos1*cos1;
    t = tan(sFi);
    n = e*cos1*cos1;
 
    raz = 1 / ((1-e)* N);
    dwa = 1 / N;
    trzy = u/24;
    cztery = (u/(24*V*V))*(1+n-9*n*t*t);
    piec = trzy*(2+3*t*t+2*n);
    szesc = (u*n/(8*V*V))*(t*t-1-n-4*n*t*t);
    siedem = (u*V)/12;
    osiem = (trzy/(V*V))*(3+8*n+5*n*n);
 
    ssinA = (L/dwa)*cos1*(1 - ((trzy/u)*L*L*sin1*sin1) + ((cztery/u)*L*L));
    scosA = (F/raz)*(1 - ((piec/u)*F*F*cos1*cos1) -((szesc/u)*F*F));
    dA = L*sin1*(1 + (siedem/u)*L*L*cos1*cos1 + (osiem/u)*F*F);
 
    double pdA = dA / 2;
    s =  sqrt((ssinA * ssinA) + (scosA+scosA));
    double sinA = ssinA / s, cosA = scosA / s;
    tgA = (sinA/cosA);
    A = atan(tgA);
 
    cout << fixed;
    cout.precision(10);
    cout << "Wyniki : " << endl << "s = " << s << endl << "A12 = " << A - pdA << endl << "A21 = " << A + pdA << " +/- 180st" << endl;
}
edytowany 1x, ostatnio: Argonus, 2014-12-28 21:35

Pozostało 580 znaków

2014-12-29 11:47
0

Ok program mi już działa jak powinien (mniej więcej, nie wiem czemu mi c++ pokazuje inne wyniki na 11/12 miejscu po przecinku jak Excel i jak to zmienić) ale mam teraz ost. prośbę, co mam zmienić w kodzie żeby lepiej wyglądał.

//Kivjoj.cpp
#include<iostream>
#include<math.h>
 
struct dane 
{
    double Ff;
    double Ll;
    double Azymutk;
    double N;
};
//prototypy funkcji
void showmenu();
void vincenty(double Fipp, double Fipk, double lambdapk, double lambdapp);
void gauss (double Fipp, double Fipk, double lambdapk, double lambdapp, double N);
dane kivjoj(double Fipp, double lambdapp, double SABp, double Aabp, double ds, double podzial);
 
int main()
{
    using namespace std;
    double Fip;
    double lambdap;
    double SAB;
    double Aab;
 
    cout << "Podaj dane w [rad]: " << endl;
    cout << "Fip = ";
    cin >> Fip;
    cout << "Lambdap = ";
    cin >> lambdap;
    cout << "Sab = ";
    cin >> SAB;
    cout << "Azymut Aab = ";
    cin >> Aab;
// Punkt I. Dzielimy całą długość linii geodezyjnej s na n elementów ds. 
 
    cout << "Pkt I. Dzielimy cala dlugosc linii geodezyjnej s na n elementow ds" << endl;
    int podzial;
    cout << "Podaj liczbe odcinkow: ";
    cin >> podzial;
    double ds;
    ds = SAB / podzial;
    cout << "Odcinek ds = " << ds;
    //funkcja algorytm kivjoja
    dane wyniki = kivjoj(Fip, lambdap, SAB, Aab,ds, podzial);
    //menu sprawdzenia
    cout << "Wybierz metode sprawdzenia." << endl;
    showmenu();
    int choice;
    cin >> choice;
    while (choice != 3)
    {
        switch(choice)
        {
        case 1 : vincenty (Fip, wyniki.Ff, wyniki.Ll, lambdap); // wskazniki.
                 break;
        case 2 : gauss (Fip, wyniki.Ff, wyniki.Ll, lambdap, wyniki.N); // wskazniki
                 break;
        default : cout << "Nie ma takiej opcji" << endl;
        }
        showmenu();
        cin >> choice;
    }
 
    cout << endl;
    system("pause");
    return 0;
}
 
void showmenu()
{
    using namespace std;
    cout << "1) Algorytm Vincenty" << endl << "2) Srednia szerokosc Gaussa" << endl << "3) koniec" << endl;
}
 
void vincenty(double Fipp, double Fipk, double lambdapk, double lambdapp)
{
 
    using namespace std;
    cout << "1) Algorytm Vincenty" << endl;
    //dane z cz. 1
    const double e = 0.0066943800229;
    const double b = 6356752.314140;
    const double f = 0.003352810681183;
 
    double L =  lambdapk - (lambdapp);
    //punkt 1
    double tan1 = (1-f) * tan(Fipp), cos1 = 1 / sqrt((1 + tan1*tan1)), sin1 = tan1 * cos1;
    //punkt 2
    double tan2 = (1-f) * tan(Fipk), cos2 = 1 / sqrt((1 + tan2*tan2)), sin2 = tan2 * cos2;
    //zmienne stworzone w trackie. 
 
    double Lambda = L, Lambdaprim;
    double sinLambda = 0, cosLambda = 0;
    double sinS = 0, sin3 = 0, Sigma = 0, sinAl = 0;
    double cos3 = 0, cosSAl = 0, cos2M = 0, C =0;
 
    do
    {
    sinLambda = sin(Lambda), cosLambda = cos(Lambda);
    sinS = (cos2*sinLambda) * (cos2*sinLambda) + (cos1*sin2-sin1*cos2*cosLambda) * (cos1*sin2-sin1*cos2*cosLambda);
    sin3 = sqrt(sinS);
    cos3 = sin1*sin2 + cos1*cos2*cosLambda;
    Sigma = atan2(sin3, cos3);
    sinAl = cos1 * cos2 * sinLambda / sin3;
    cosSAl = 1 - sinAl*sinAl;
    cos2M = cos3 - 2*sin1*sin2/cosSAl;
    C = (f/16)*cosSAl*(4+f*(4-3*cosSAl));
    Lambdaprim = Lambda;
    Lambda = L + (1-C) * f * sinAl * (Sigma + C*sin3*(cos2M+C*cos3*(-1+2*cos2M*cos2M)));
    } while ((Lambda-Lambdaprim) > 0.000000000001);
 
    double u = cosSAl * e;
    double A = 1 + u/16384*(4096+u*(-768+u*(320-175*u)));
    double B = u/1024 * (256+u*(-128+u*(74-47*u)));
    double dSigma = B*sin3*(cos2M+(B/4)*(cos3*(-1+2*cos2M*cos2M)- (B/6)*cos2M*(-3+4*cos2M*cos2M)));
 
    double s = b*A*(Sigma-dSigma);
 
    double A1 = atan2(cos2*sinLambda,  cos1*sin2-sin1*cos2*cosLambda);
    double A2 = atan2(cos1*sinLambda, -sin1*cos2+cos1*sin2*cosLambda);
    double AA1, AA2;
 
    if(cos2*sinLambda > 0 && cos1*sin2-sin1*cos2*cosLambda > 0)
        AA1 = A1;
    else if(cos2*sinLambda > 0 && cos1*sin2-sin1*cos2*cosLambda < 0)
        AA1 = 3.14159265359 - A1;
    else if(cos2*sinLambda < 0 && cos1*sin2-sin1*cos2*cosLambda < 0)
        AA1 = A1 + 3.14159265359;
    else
        AA1 = 2 * 3.14159265359 - A1;
 
    if(cos2*sinLambda > 0 && -sin1*cos2+cos1*sin2*cosLambda > 0)
        AA2 = A2;
    else if(cos1*sinLambda > 0 && -sin1*cos2+cos1*sin2*cosLambda < 0)
        AA2 = 3.14159265359 - A2;
    else if(cos1*sinLambda < 0 && -sin1*cos2+cos1*sin2*cosLambda < 0)
        AA2 = A2 + 3.14159265359;
    else
        AA2 = 2 * 3.14159265359 - A2;
 
    cout << fixed;
    cout.precision(11);
    cout << "Wyniki: " << endl << "S = " << s << endl << "A1 = " << AA1 << endl << "A2 = " << AA2 << endl;
 
}
 
void gauss (double Fipp, double Fipk, double lambdapk, double lambdapp, double N)
{
    using namespace std;
    cout << "2) Srednia szerokosc Gaussa" << endl;
    //stale
    const double e = 0.0066943800229;
    const double b = 6356752.314140;
    const double f = 0.003352810681183;
    const double u = 0.4342944819;
    //dane
    double L = lambdapk - lambdapp;
    double F = Fipk - Fipp;
    double sFi = (Fipp + Fipk)/2;
    double cos1 = cos(sFi);
    double sin1 = sin(sFi);
 
    double ssinA, scosA, dA, raz, dwa, trzy, cztery, piec, szesc, siedem, osiem, V, n, t;
    double s, A, tgA;
 
    V = 1 + e*cos1*cos1;
    t = tan(sFi);
    n = e*cos1*cos1;
 
    raz = 1 / ((1-e)* N);
    dwa = 1 / N;
    trzy = 0.01809560341;
    cztery = (u/(24*V*V))*(1+n-9*n*t*t);
    piec = (u/24)*(2+3*t*t+2*n);
    szesc = (u*n/(8*V*V))*(t*t-1-n-4*n*t*t);
    siedem = (u*V)/12;
    osiem = (u/(24*V*V))*(3+8*n+5*n*n);
 
    ssinA = (L/dwa)*cos1*(1 - ((trzy/u)*L*L*sin1*sin1) + ((cztery/u)*L*L));
    scosA = (F/raz)*(1 - ((piec/u)*F*F*cos1*cos1) -((szesc/u)*F*F));
    dA = L*sin1*(1 + (siedem/u)*L*L*cos1*cos1 + (osiem/u)*F*F);
 
    double pdA = dA / 2;
    s =  sqrt((ssinA * ssinA) + (scosA*scosA));
    double sinA = ssinA / s, cosA = scosA / s;
    tgA = (sinA/cosA);
    A = atan(tgA);
 
    cout << fixed;
    cout.precision(10);
    cout << endl << "SsinA = " << ssinA << " scosA = " << scosA;
    cout << endl << u << endl;
    cout << "Wyniki : " << endl << "s = " << s << endl << "A12 = " << A - pdA << endl << "A21 = " << A + pdA << " +/- 180st" << endl;
}
 
dane kivjoj(double Fip, double lambdap, double SAB, double Aab, double ds, double podzial)
{
    using namespace std;
    const double a = 6378137;
    const double b = 6356752.31414;
    const double e = 0.0066943800229;
 
    // Początek petli Kivjoj'a
    int i;
    int coute = 0;
    double M;
    double N;
 
    for(i = 0; i < podzial; ++i)
    {
        double Yi, Li, Ai, Mmi, Nmi, pAmi, Ami, FFi1, Fim, pierwiastek, pierwiastekm;
    // Obliczam M i N;
        pierwiastek =  sqrt(1 - ( e * sin(Fip) * sin(Fip)));
        N = a/pierwiastek;
        M = (1-e)* N;
    //Obliczam pierwszy przyrost 
        FFi1 = (ds * (cos(Aab)) / M);
        Fim = Fip + (FFi1/2.000);       
    // Obliczam Mmi i Nmi
        pierwiastekm =  sqrt(1 - ( e * sin(Fim)*sin(Fim)));
        Nmi = (a) / (pierwiastekm);
        Mmi = (1-e)*Nmi;
    // Obliczam Ami
        pAmi = ( ds * (sin(  Aab)) * (tan(Fim))) / (Nmi);
        Ami = Aab + (0.5 * pAmi);
    //Obliczam dla elemntu ds
        // Obliczam Yi
        Yi = ( ds * (cos( Ami)) ) / Mmi;
        // Obliczam Li
        Li = ( ds * (sin( Ami))) / ( Nmi * (cos(Fim)));
        // Obliczam Ai
        Ai = ((ds * (sin( Ami))) * (tan( Fim))) /( Nmi);
    // Kończenie pęteli dane pkt 2.
        //Obliczam Fip[1]
        Fip = Fip + Yi;
        //Obliczam lambdap[1]
        lambdap = lambdap + Li;
        //Obliczam Aab[1]
        Aab = Aab + Ai;
 
        coute++;
 
    }
    cout << endl;
    cout << "Podaje wyniki: " << endl;
    cout << "Liczba powtorzen petli: " << coute++ << endl;
    cout.precision( 11 );
    /*cout << "Podaje wyniki pośrednie z ostatniego przejscia: " << "M = " << M << " N = " << N << " FFi1 = " << FFi1 << endl;
    cout << " Fim = " << Fim[i] << " Mmi = " << Mmi << " Nmi = " << Nmi << " pAmi = " << pAmi[i];
    cout << " Ami = " << Ami[i] << endl;*/
    /*cout << "Podaje wyniki posrednie: " << "B = " << Yi[podzial-1] << " L = " << Li[podzial-1] << " A = " << Ai[podzial-1] << endl;*/
    cout << fixed;
    cout.precision(10);
    cout << "Fip = " << Fip << endl;
    cout << "Lambdap = " << lambdap << endl;
    cout << "Aab = " << Aab << endl;
    cout << endl;
    cout << endl;
 
    dane danee;
    danee.Ff = Fip;
    danee.Ll = lambdap;
    danee.Azymutk = Aab;
    danee.N = N;
    return danee;
}

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0