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;
}