精度损失从两点计算度数

时间:2012-03-01 20:23:19

标签: java

我创建了一个类位置,允许设置,更改位置(坐标x,y,限制由xMin,xMax,yMin,yMax决定),以计算两点之间的距离,并获得方向来自其他地方。
方向是从另一个位置开始的(从[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 个答案:

答案 0 :(得分:3)

你接近45度,这意味着你将要接近最大值和最小值来操作某些触发功能。我会检查步骤,看​​看你的中间结果是否非常接近0。

  • 尝试使用dx*dxdy*dy替换对pow的调用。

  • 用中间结果打破这个。

答案 1 :(得分:2)

使用Math.atan2(deltaX, deltaY)以弧度计算向量的角度。它会从02 * Math.PI一直返回答案,而不必根据输入的符号进行个案工作。