我的代码有一个奇怪的问题:我想计算一个arc-cosinus,我使用Math.acos。但是当我尝试计算它时,它有时会返回NaN(我说“有时”因为它与 相同值 一起发生1/10时间。)
最糟糕的是:
double angle = Math.acos((v.xdest-v.xi)/Math.sqrt(Math.pow(v.xdest-v.xi,2)+Math.pow(v.ydest-v.yi,2)));
System.out.println(angle);
/*
Some code
*/
System.out.println(Math.acos((v.xdest-v.xi)/Math.sqrt(Math.pow(v.xdest-v.xi,2)+Math.pow(v.ydest-v.yi,2))));
当我运行此代码时,我得到:
NaN
2.620575634136091
即使是 相同的 计算!
如果我跑:
double angle = Math.acos((v.xdest-v.xi)/Math.sqrt(Math.pow(v.xdest-v.xi,2)+Math.pow(v.ydest-v.yi,2)));
System.out.println(angle);
System.out.println(Math.acos((v.xdest-v.xi)/Math.sqrt(Math.pow(v.xdest-v.xi,2)+Math.pow(v.ydest-v.yi,2))));
/*
Some code
*/
我得到了
NaN
NaN
看起来两个计算之间的代码使它成为可能。但是这段代码不会修改任何东西。
我不知道该怎么做。
(xdest-xi
和ydest-yi
始终相同,因此它们不是我问题的根源)
答案 0 :(得分:2)
double Math.acos(double v)如果v是NaN或者Math.abs(v)大于1,则应返回NaN。 如果您尝试计算两个向量之间的角度,则应使用以下公式:
double angleBetweenVectors(Vect v1, Vect v2) {
double cos = scalarProduct(v1, v2) / (length(v1) * length(v2));
double acos = Math.acos(cos);
return Math.toDegrees(acos);
}
double scalarProduct(Vect v1, Vect v2) {
double x1 = v1.xdest - v1.xi;
double x2 = v2.xdest - v2.xi;
double y1 = v1.ydest - v1.yi;
double y2 = v2.ydest - v2.yi;
return x1*x2 + y1*y2;
}
double length(Vect v) {
double x = v.xdest - v.xi;
double y = v.ydest - v.yi;
return Math.sqrt(x*x + y*y);
}