2012-03-01 2 views
2

나는 (x, y, xMin, xMax, yMin, yMax에 의해 좌표가 결정되는) 위치를 변경하고 위치를 변경할 수있는 위치를 만들었습니다. 2 점, 그리고 다른 위치에서 방향을 얻으 려합니다.
다른 방향에서 방향이 deg (0.2pi)입니다.
방향은 북쪽 (시계 방향으로 북쪽이 더 높은 좌표가있는 곳의 북쪽이라고 가정)에서 시작합니다. 이 경우,이 44.29도를 인쇄이 예에서 :두 점에서도를 계산하는 정확도 상실

Location l1,l2; 
l1=new Location(0.0,0.0); 
l2=new Location(300.0,300.0); 
System.out.print(Math.toDegrees(l1.getDirectionFrom(l2))); 

문제는 정밀도 :

package TruckingCompany; 

public class Location 
{ 
    private double x; 
    private double y; 
    private static final double xMax=1000.0; 
    private static final double xMin=-1000.0; 
    private static final double yMax=1000.0; 
    private static final double yMin=-1000.0; 
    public Location() 
    { 
     setX(0.0); 
     setY(0.0); 
    } 
    public Location(double x,double y) 
    { 
     setX(x); 
     setY(y); 
    } 
    public Location(Location location) 
    { 
     setX(location.getX()); 
     setY(location.getY()); 
    } 
    public void setX(double x) 
    { 
     if(x>=xMin && x<=xMax) 
     this.x=x; 
    } 
    public void setY(double y) 
    { 
     if(y>=yMin && y<=yMax) 
      this.y=y; 
    } 
    public void set(double x,double y) 
    { 
     setX(x); 
     setY(y); 
    } 
    public double getX() 
    { 
     return x; 
    } 
    public double getY() 
    { 
     return y; 
    } 
    public double getDistanceFrom(Location from) 
    { 
     double dx,dy; 
     dx=from.getX()-x; 
     dy=from.getY()-y; 
     return Math.sqrt(Math.pow(dx, 2.0)+Math.pow(dy, 2.0)); 
    } 
    public double getDirectionFrom(Location from) 
    { 
     double dy=from.getY()-y; 
     double direction=Math.PI/4 - Math.asin (Math.toRadians(dy/getDistanceFrom(from))); 
     if(Double.isNaN(direction)==false) 
     { 
      if(from.getX()-x<0.0) 
      direction+=Math.PI/2; 
      if(dy<0.0) 
       direction+=Math.PI; 
     } 
     return direction; 
    } 
    @Override 
    public String toString() 
    { 
     return "(" + x + " , " + y + ")"; 
    } 
} 

문제는 예를 들어 나는이 두 위치에서 거리를 계산하려고하면 정밀도 45.0, 왜 엄청난 정밀도의 손실입니까?

+2

사이드 노트 :'Math.atan2()'를 사용할 수 없습니까? – Mysticial

+0

0,0-> 0,300 및 0,0-> 300,0에 대한 예상 결과를 얻습니까? – DNA

답변

3

당신은 45도에 가깝습니다. 즉, 일부 삼각 함수에 대해서는 최대 및 최소에 가깝게 작동 할 것입니다. 당신이 dx*dxdy*dy과 포로에 대한 호출을 교체하십시오 0

  • 에 가까운 중간 결과를 얻는다면 나는 단계를 확인하고 볼 것.

  • 중간 결과를 나눕니다.

+0

예! 수치적인 질문이있어! 내 수치 해석 교수님을 데려가십시오! :-) –

+0

왜 pow를 dx * dx로 바꾸는 것이 그렇게 똑같지 않습니까? –

+0

아니요, 일반적으로 pow는 pow (3.14159,2.71828)와 같은 수레의 조합을 처리 할 수 ​​있어야합니다. * 수학적으로 * 같은 것으로 보입니다. 실제 계산에는 인수의 로그를 취하는 것과 관련이있을 수 있으며 정밀도를 잃을 수 있습니다. –

2

사용 Math.atan2(deltaX, deltaY) 라디안 벡터의 각도를 계산합니다. 입력의 부호에 따라 케이스 작업을하지 않고도 0에서 2 * Math.PI까지 응답을 반환합니다.