2012-03-01 125 views
2

我已经作出了类位置,其允许设置,改变一个位置,(坐标x,y,该限制由XMIN,XMAX,YMIN,YMAX决定),以c​​aluculate之间的距离两点,并从另一个位置获取方向。
方向是从另一个位置递减(在[0,2pi])。
方向从北变为(假定北是在有较高的坐标定向的杆),以顺时针方向。损失精度计算度两点

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 + ")"; 
    } 
} 

问题是精度,例如我尝试这两个位置计算距离:

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

的问题是精度:在这个例子中它打印44.29度,它应该是45.0,为什么这么大的精度损失?

+2

旁注:你就不能使用'Math.atan2()'? – Mysticial 2012-03-01 20:30:10

+0

您是否获得了0,0-> 0,300和0,0-> 300,0的预期结果? – DNA 2012-03-01 20:32:09

回答

3

你是接近45度,这意味着你将要接近操作以最大值和最小值一些三角函数。我检查的步骤,看看你得到的中间结果非常接近于0

  • 尝试更换电话与dx*dxdy*dy战俘。

  • 中间结果打破这件事。

+0

耶!我有一个数字问题!拿我的数值分析教授! :-) – 2012-03-02 00:12:15

+0

为什么用dx * dx替换pow,是不是一样? – 2012-03-02 10:56:53

+0

不,通常不会,因为pow必须能够处理浮动的任何组合,例如pow(3.14159,2.71828)。 *数学*它们看起来是一样的;实际的计算可能涉及类似于记录参数的事情,并且会导致您失去精度。 – 2012-03-02 18:35:28

2

使用Math.atan2(deltaX, deltaY)来计算弧度向量的角度。它返回答案从02 * Math.PI一路,而不必依赖于输入的招牌做个案。