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。