Przeliczanie z BLH na XYZ

0

Witam, moje pytanie brzmi, czemu ten sam kod daje w rezultacie różne wyniki ?

obraz w załączniku

fragment kodu tego po lewej :
if (WGS84.isSelected() )
{

	//X = (N + h) * cosB * cosL
	//Y = (N + h) * cosB * sinL
	//Z = (N * (1 - e^2)) * sinB
	//N = a / (sqrt(1 - e^2 * sin^2 * B))

	B =(Double.valueOf(tB.getText())); 
	L =(Double.valueOf(tL.getText()));
	h =(Double.valueOf(th.getText()));

			
	N1=a1/(sqrt(1-e1*pow(sin((B*PI)/180),potega)));
	N2=a2/(sqrt(1-e2*pow(sin((B*PI)/180),potega)));

	X1=((a1/(sqrt(1-e1*pow(sin((B*PI)/180),potega))))+h)*cos((B*PI)/180)*cos((L*PI)/180);
	Y1=((a1/(sqrt(1-e1*pow(sin((B*PI)/180),potega))))+h)*cos((B*PI)/180)*sin((L*PI)/180);
	Z1=((a1/(sqrt(1-e1*pow(sin((B*PI)/180),potega))))*(1-e1))*sin((B*PI)/180);
			
	X2=((a2/(sqrt(1-e2*pow(sin((B*PI)/180),potega))))+h)*cos((B*PI)/180)*cos((L*PI)/180);
	Y2=((a2/(sqrt(1-e2*pow(sin((B*PI)/180),potega))))+h)*cos((B*PI)/180)*sin((L*PI)/180);
	Z2=((a2/(sqrt(1-e2*pow(sin((B*PI)/180),potega))))*(1-e2))*sin((B*PI)/180);

	java.text.DecimalFormat df=new java.text.DecimalFormat("0.0000");


	twynikN2.setText(String.valueOf(df.format(N2)));



	twynikX2.setText(String.valueOf(df.format(X2)));
	twynikY2.setText(String.valueOf(df.format(Y2)));
	twynikZ2.setText(String.valueOf(df.format(Z2)));
			
	twynikX1.setText("");
	twynikY1.setText("");
	twynikZ1.setText("");
	twynikN1.setText("");

fragment kodu tego prawej :

if (WGS84.isSelected() )
{

	//X = (N + h) * cosB * cosL
	//Y = (N + h) * cosB * sinL
	//Z = (N * (1 - e^2)) * sinB
     //N = a / (sqrt(1 - e^2 * sin^2 * B))


    B =  (Double.valueOf(tBst.getText()) + ((Double.valueOf(tBmin.getText()))/60) + ((Double.valueOf(tBsek.getText()))/3600));
    L =  (Double.valueOf(tLst.getText()) + ((Double.valueOf(tLmin.getText()))/60) + ((Double.valueOf(tLsek.getText())))/3600);
    h =(Double.valueOf(th.getText()));

			
	N1=a1/(sqrt(1-e1*pow(sin((B*PI)/180),potega)));
	N2=a2/(sqrt(1-e2*pow(sin((B*PI)/180),potega)));

	X1=((a1/(sqrt(1-e1*pow(sin((B*PI)/180),potega))))+h)*cos((B*PI)/180)*cos((L*PI)/180);
	Y1=((a1/(sqrt(1-e1*pow(sin((B*PI)/180),potega))))+h)*cos((B*PI)/180)*sin((L*PI)/180);
	Z1=((a1/(sqrt(1-e1*pow(sin((B*PI)/180),potega))))*(1-e1))*sin((B*PI)/180);
	
	X2=((a2/(sqrt(1-e2*pow(sin((B*PI)/180),potega))))+h)*cos((B*PI)/180)*cos((L*PI)/180);
	Y2=((a2/(sqrt(1-e2*pow(sin((B*PI)/180),potega))))+h)*cos((B*PI)/180)*sin((L*PI)/180);
	Z2=((a2/(sqrt(1-e2*pow(sin((B*PI)/180),potega))))*(1-e2))*sin((B*PI)/180);

	java.text.DecimalFormat df=new java.text.DecimalFormat("0.0000");


	twynikN2.setText(String.valueOf(df.format(N2)));



	twynikX2.setText(String.valueOf(df.format(X2)));
	twynikY2.setText(String.valueOf(df.format(Y2)));
	twynikZ2.setText(String.valueOf(df.format(Z2)));
	
	twynikX1.setText("");
	twynikY1.setText("");
	twynikZ1.setText("");
	twynikN1.setText("");

wspomnę, że jestem początkujący ;p

0

nie chce mi sie tego czytac całe, ale to wyglada na to samo, chyba, że to jeden z tych legendarnych przypadkow kiedy trzeba uzyc strictfp na metodzie

0

bo to jest to samo :( tylko w dwóch różnych klasach , każde te okienko ma swoją klasę. Zrobiłem okienko po lewej i na tym samym kodzie ( z modyfikacją B na st min sek i L na st min sek) okienko po prawej.
nie używałem nigdy strictfp

0

ten po prawej ma jakieś tb.minText, to jasne, że inne wyniki będą

0

tBst (stopnie, pierwsze male okieno), tBmin (minuty, drugie małe okienko) tBsek (sekundy, trzecie małe okienko) i to przekształcam na stopnie w formie dziesiętnej i wychodzi to samo co w lewym oknie tB, czyli szerokość geodezyjna

0

B, L, H są takie same, Zrobiłeś copy-paste reszty kodu i daje inne wyniki?

0

Tak. Myślę że to może wina dokładności i jakichś zaokrągleń niewidocznych, gdyż ten excel jest moją kontrolą i jak wpisze dane st min sek a formę dziesiętną wyliczy excel to zgadza się z okienkiem prawym, ale jak formę dziesiętną wpiszę z ręki (taką sama), nie wyliczoną z poszczególnych st min i sek, to wtedy zgadza się z okienkiem lewym. Nie sądziłem tylko, że to aż taka rozbieżność będzie i wynikać tylko z dalszych liczb po przecinku.

0

Różnica najprawdopodobniej wynika z faktu, że w Javie wykonujesz obliczenia B,L i h na podstawie składowych (stopnie, minuty, sekundy) typu double, który musi zaokrąglić wszystkie wartości dziesiętne nie dające się zapisać binarnie (np. 0,5 zapisze bez zaokrągleń bo to 1/2, a 0,1 musi zostać zaokrąglone). Excel zapisuje liczby w postaci dziesiętnej, więc w pierwszym oknie BLh masz obliczone przez Excela i zaokrąglany jest tylko wynik po konwersji do double, a w drugim obliczasz BLih na podstawie zaokrąglanych wartości i generujesz większy błąd. Jakbyś robił obliczenia na typie BigDecimal to pewnie nie byłoby takich różnic.

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