Java 360度角
我在这里编码了这个代码:Java 360度角,java,math,geometry,angle,Java,Math,Geometry,Angle,我在这里编码了这个代码: double cosine = (v1.x*v2.x+v1.y*v2.y)/(150*150); double radian = Math.acos(cosine); double angle = Math.toDegrees(radian); V1和V2是两个向量,它们是保持简单的简单点()。现在我计算它们之间的角度,效果很好。但超过180度,它又回到179178度。。。但我想要360度 问题是,例如弧度不
double cosine = (v1.x*v2.x+v1.y*v2.y)/(150*150);
double radian = Math.acos(cosine);
double angle = Math.toDegrees(radian);
V1和V2是两个向量,它们是保持简单的简单点()。现在我计算它们之间的角度,效果很好。但超过180度,它又回到179178度。。。但我想要360度
问题是,例如弧度不会变为负值,所以我可以把它放在if段中
谢谢您的建议。您使用两个向量的点积来计算它们之间的角度,但是,由于点积是可交换的
a.b=b.a
-因此,无法获得角度的意义,只有其大小(如您所发现的)acos在180º以上是模糊的
尝试改用atan2
。应该是这样的:
double theta1 = Math.atan2(v1.y, v1.x);
double theta2 = Math.atan2(v2.y, v2.x);
double theta = theta1 - theta2;
请注意,
atan2
总是在-pi中返回答案。。。圆周率,所以你必须加上圆周率,使其在0范围内。。。2.0*pi。您可以使用标量积和叉积获得全量程角度(-pi..pi,适用于大多数数学库):
radian = Math.atan2(v1.x*v2.y-v1.y*v2.x, v1.x*v2.x+v1.y*v2.y)
这似乎更像是一个数学问题,而不是一个编码问题。你用纸和铅笔怎么做?是的,我想这也是一道数学题。我编码的方式和我在纸上写的方式一样(我就是这样学的)。开始行似乎只给了我较小的角度。acos总是返回前两个象限的值。你必须从你的顶点决定你所在的象限,然后相应地调整你的结果。啊,我明白了。好的,但我仍然要检查它是否是mh,我改变了它,有0180和0-179的值,我用:double diff=180+数学,toDegrees(弧度);如果(弧度),最好加360次(如果是负数)-以获得逆时针转动v1直到V2所需的角度,您不想加pi。如果小于0,您想加2*pi。