Direct way of computing clockwise angle between 2 vectors的答案有助于获得两个向量之间的顺时针角度,但我需要知道的是如何从特定向量的顺时针方向获取两个向量的角度。
以下是我想说的内容的直观解释。当从红色矢量顺时针方向进入时,顺时针角度为:(请原谅不良图纸)
但是当从黑色矢量顺时针方向前进时,顺时针角度为:
编辑:我会重新解释一下我的问题。这就是我想要实现的目标。我一直在关注生成三角网格的这个古老但有用的链接:http://www.geom.uiuc.edu/~samuelp/del_project.html#algorithms
通过上面的图像,我总是希望角度从特定的矢量顺时针方向。我一直在使用链接的SO答案中的代码来获取角度,但在我的情况下它是不正确的
float dotProd = vx*ux + vy*uy;
float det = vx*uy - vy*ux;
float angle = MathUtils.atan2(det, dotProd);//in radians
if(angle < 0) angle += MathUtils.PI;
角度计算错误地允许连接不必要的边。
我该如何解决这个问题?
答案 0 :(得分:0)
我确定有更短的方法可以做到,但如果你知道你在哪里0,0 首先检查你的矢量在哪个季度,然后相应地执行计算。
它将解决您的解决方案,但在数学上我认为您可以更快地到达目的地。
答案 1 :(得分:0)
我做了这些实验:
int[] v1={5, 2}, v2={3, 4}, v3={5, 0};
double d1=v1[0]*v2[0]+v1[1]*v2[1], d2=v1[0]*v2[1]-v1[1]*v2[0];
System.out.println(Math.toDegrees(Math.atan2(d2, d1)));
d2=v2[0]*v1[1]-v2[1]*v1[0];
System.out.println(Math.toDegrees(Math.atan2(d2, d1)));
d1=v3[0]*v1[0]+v3[1]*v1[1]; d2=v3[0]*v1[1]-v3[1]*v1[0];
System.out.println(Math.toDegrees(Math.atan2(d2, d1)));
d1=v1[0]*v3[0]+v1[1]*v3[1]; d2=v1[0]*v3[1]-v1[1]*v3[0];
System.out.println(Math.toDegrees(Math.atan2(d2, d1)));
d1=v2[0]*v3[0]+v2[1]*v3[1]; d2=v3[0]*v2[1]-v3[1]*v2[0];
System.out.println(Math.toDegrees(Math.atan2(d2, d1)));
似乎计算的角度是直接角度:如果它是正的,则方向是逆时针方向(例如从v3到v2),如果它是负的,那么它是顺时针方向。
我使用标准java atan2我不知道你在用什么。
因此,要明智地获得时钟,你必须检查结果:如果是正数则减去360度。
你必须做自己的实验来证实这种消极/积极的态度。