我创建了一个类位置,允许设置,更改位置(坐标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,为什么如此巨大的精度损失?
答案 0 :(得分:3)
你接近45度,这意味着你将要接近最大值和最小值来操作某些触发功能。我会检查步骤,看看你的中间结果是否非常接近0。
尝试使用dx*dx
和dy*dy
替换对pow的调用。
用中间结果打破这个。
答案 1 :(得分:2)
使用Math.atan2(deltaX, deltaY)
以弧度计算向量的角度。它会从0
到2 * Math.PI
一直返回答案,而不必根据输入的符号进行个案工作。