2013-03-14 9 views
2

Java에서 내 응용 프로그램에 문제가 있습니다. 나는 지구상에서 3 점과 3 점의 거리를 가지고 있으며 4 점을 찾아야합니다. 제 코드에서는 위키 피디 어 (wikipedia)의 삼중 항을 사용하여 삼중 항을 계산했습니다. 해결책은 49.195167,16.607208이어야합니다 (Google지도의 GPS).3D 삼각 측량 Java

누군가가 코드에서 실수를 찾도록 도울 수 있다면 매우 기쁩니다. 잘못된 GPS를 계산하기 때문입니다.

정말 고마워요! 솔루션이 없을 수단 먼저

float earthR = 6371; 
    float p1x = (float) 61.47; 
    float p1y = (float) 23.76; 
    float p2x = (float) 42.80; 
    float p2y = (float) -1.63; 
    float p3x= (float) 39.67; 
    float p3y= (float) 20.85; 
    float r1 = 1470; 
    float r2 = 1617; 
    float r3 = 1127; 


    float P1x = (float) (earthR*(Math.cos(Math.toRadians(p1x))*Math.cos(Math.toRadians(p1y)))); 
    float P1y = (float) (earthR*(Math.cos(Math.toRadians(p1x))*Math.sin(Math.toRadians(p1y)))); 
    float P1z = (float) (earthR*(Math.sin(Math.toRadians(p1x)))); 

    float P2x = (float) (earthR* (Math.cos(Math.toRadians(p2x))*Math.cos(Math.toRadians(p2y)))); 
    float P2y = (float) (earthR*(Math.cos(Math.toRadians(p2x))*Math.sin(Math.toRadians(p2y)))); 
    float P2z = (float) (earthR*(Math.sin(Math.toRadians(p2x)))); 
    float P3x = (float) (earthR* (Math.cos(Math.toRadians(p3x))*Math.cos(Math.toRadians(p3y)))); 
    float P3y = (float) (earthR*(Math.cos(Math.toRadians(p3x))*Math.sin(Math.toRadians(p3y)))); 
    float P3z = (float) (earthR*(Math.sin(Math.toRadians(p3x)))); 

    float exx = (float) ((P2x-P1x)/Math.sqrt(Math.pow(P2z-P1z, 2)+Math.pow((P2x-P1x),2)+Math.pow((P2y-P1y),2))); 
    float exy = (float) ((P2y-P1y)/Math.sqrt(Math.pow(P2z-P1z, 2)+Math.pow((P2x-P1x),2)+Math.pow((P2y-P1y),2))); 
    float exz = (float) ((P2z-P1z)/Math.sqrt(Math.pow(P2z-P1z, 2)+Math.pow((P2x-P1x),2)+Math.pow((P2y-P1y),2))); 
    float EX = (float) Math.sqrt(Math.pow(exx, 2)+Math.pow(exy, 2)+Math.pow(exz,2)); 

    float i = (float) Math.sqrt(Math.pow((P3x-P1x)*EX, 2)+Math.pow((P3y-P1y)*EX, 2)+Math.pow((P3z-P1z)*EX, 2)); 

    float eyx = (float) ((P3x-P1x-(i*exx))/Math.sqrt((Math.pow(P3z-P1z-(i*exz),2))+(Math.pow(P3x-P1x-(i*exx),2))+(Math.pow(P3y-P1y-(i*exy),2)))); 
    float eyy = (float) ((P3y-P1y-(i*exy))/Math.sqrt((Math.pow(P3z-P1z-(i*exz),2))+(Math.pow(P3x-P1x-(i*exx),2))+(Math.pow(P3y-P1y-(i*exy),2)))); 
    float eyz = (float) ((P3z-P1z-(i*exz))/Math.sqrt((Math.pow(P3z-P1z-(i*exz),2))+(Math.pow(P3x-P1x-(i*exx),2))+(Math.pow(P3y-P1y-(i*exy),2)))); 
    float EY = (float) Math.sqrt(Math.pow(eyx, 2)+Math.pow(eyy, 2)+Math.pow(eyz, 2)); 

    float ezx = (exy*eyz)-(exz*exy); 
    float ezy = (exz*eyx)-(exx*eyz); 
    float ezz = (exx*eyy)-(exy*eyx); 
    float EZ = (float) Math.sqrt(Math.pow(ezx, 2)+Math.pow(ezy, 2)+Math.pow(ezz, 2)); 

    float d = (float) Math.sqrt((Math.pow(P2x-P1x,2))+(Math.pow(P2y-P1y,2))+Math.pow(P2z-P1z, 2)); 

    float j = (float) Math.sqrt(Math.pow((P3x-P1x)*EY, 2)+Math.pow((P3y-P1y)*EY, 2)+Math.pow((P3z-P1z)*EY, 2)); 
    float x = (float) ((Math.pow(r1, 2)-Math.pow(r2, 2)+Math.pow(d, 2))/(2*d)); 
    float y = (float) (Math.pow(r1, 2)-Math.pow(r3, 2)+Math.pow(i, 2)+Math.pow(j, 2))/(2*j)- (i*x/j); 

    float z1 = (float) (Math.pow(r1,2) - Math.pow(x,2) - Math.pow(y,2)); 
if (z1<0){ z1 = z1*(-1);} 
    float z = (float) Math.sqrt(z1); 

    float lat = (float) Math.toDegrees(Math.atan2(y,x)); 
    float lon = (float) Math.toDegrees(Math.asin((z)/earthR)); 
    System.out.println(lat); 
    System.out.println(lon); 

답변

1

, z1가 0보다 작은 경우. 교차하지 않는 세 개의 구체로 생각할 수 있습니다.

0보다 크면 두 개의 교차가 있음을 의미합니다.

if(z1 > 0) 
{ 
    z1 = Math.sqrt(z1); 
    z2 = z1*-1; 
} 

이 단계 후에는 2 점을 가지고 :

result1 = P1 + exx + eyy + ez*z1; 
result2 = P1 + exx + eyy + ez*z2; 

세 번째 점은 플레이하는 곳입니다. 이 두 결과의 거리를 P3으로 계산합니다. 수단

if(Math.abs(distance(result1, P3) - r3) < Math.abs(distance(result2, P3) - r3)) 
    return result1; 
else return result2; 

, 넌 P3r3로의 거리를 만족하는 점을 지정.