Funkcje i wskazniki (Algorytmy Kivjoja,vincentego i gaussa)

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

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