Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 从两个矢量计算方向角?_Algorithm_Vector_Angle - Fatal编程技术网

Algorithm 从两个矢量计算方向角?

Algorithm 从两个矢量计算方向角?,algorithm,vector,angle,Algorithm,Vector,Angle,假设我有两个二维向量,一个用于对象的当前位置,另一个用于对象的上一个位置。如何计算出旅行的角度方向 这张图片可能有助于理解我的目标: 仍然不确定旋转矩阵是什么意思,但这是一个从方向向量获取方位的简单例子 复杂的答案: double azimuth = acos ((x2-x1)/sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1)); //then do a quadrant resolution based on the +/- sign of (y2-y1

假设我有两个二维向量,一个用于对象的当前位置,另一个用于对象的上一个位置。如何计算出旅行的角度方向

这张图片可能有助于理解我的目标:


仍然不确定旋转矩阵是什么意思,但这是一个从方向向量获取方位的简单例子

复杂的答案:

 double azimuth = acos ((x2-x1)/sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1));
 //then do a quadrant resolution based on the +/- sign of (y2-y1) and (x2-x1)
 if (x2-x1)>0 {
   if (y2-y1)<0 {  azimuth = Pi-azimuth; } //quadrant 2
 } else 
 { if (y2-y1)> 0 {  azimuth = 2*Pi-azimuth;} //quadrant 4
    else  { azimuth = Pi + azimuth;} //quadrant 3
 }
通常,您应该使用2D向量打包一些转换/实用功能:一个用于从X,Y(carthesian)转换为θ,R(极坐标)。您还应该支持基本的向量操作,如加法、减法和点积。 在这种情况下,您的答案是:

 double azimuth  =  (P2 - P1).ToPolarCoordinate().Azimuth;
其中ToPolarCoordinate()和ToCarhtesianCoordinate()是从一种类型的向量切换到另一种类型的两个互反函数

简单的一个:

 double azimuth = acos ((x2-x1)/sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1));
 //then do a quadrant resolution based on the +/- sign of (y2-y1) and (x2-x1)
 if (x2-x1)>0 {
   if (y2-y1)<0 {  azimuth = Pi-azimuth; } //quadrant 2
 } else 
 { if (y2-y1)> 0 {  azimuth = 2*Pi-azimuth;} //quadrant 4
    else  { azimuth = Pi + azimuth;} //quadrant 3
 }
双方位角=acos((x2-x1)/sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
//然后根据(y2-y1)和(x2-x1)的+/-符号进行象限分辨率计算
如果(x2-x1)>0{
如果(y2-y1)0{方位角=2*Pi方位角;}//象限4
else{方位角=π+方位角;}//象限3
}

行程方向向量将是两个位置向量的差

d = (x1, y1) - (x, y) = (x1 - x, y1 - y)
现在,当你问方向角时,这取决于你想要测量角度的方向。它是相对于x轴吗?按照Radu的答案。相对于任意向量?参见justjeff的答案

编辑:要获取相对于y轴的角度,请执行以下操作:

tan (theta) = (x1 -x)/(y1 - y)          
角度的切线是差分向量的x坐标与差分向量的y坐标之比

所以

其中arctan表示反切线。不要与切线的倒数相混淆,许多人都这样做,因为它们都经常被表示为tan^-1。并且确保您知道您是以度还是弧度工作。

如果您使用的是C(或使用相同函数集的其他语言)然后您可能正在查找
atan2()
函数。从您的图表中:

double theta = atan2(x1-x, y1-y);
该角度将从垂直轴开始,如您所标记,并以弧度(上帝自己的角度单位)测量。

小心使用,以避免象限问题和被零除。这就是它的用途

float getAngle(CGPoint ptA, CGPoint ptOrigin, CGPoint ptB)
{
    CGPoint A = makeVec(ptOrigin, ptA);
    CGPoint B = makeVec(ptOrigin, ptB);

    // angle with +ve x-axis, in the range (−π, π]
    float thetaA = atan2(A.x, A.y);  
    float thetaB = atan2(B.x, B.y);

    float thetaAB = thetaB - thetaA;

    // get in range (−π, π]
    while (thetaAB <= - M_PI)
        thetaAB += 2 * M_PI;

    while (thetaAB > M_PI)
        thetaAB -= 2 * M_PI;

    return thetaAB;
}

请注意,在上面的任一代码部分中,如果一个(或两个)向量的长度接近于0,那么这将失败。因此,您可能希望以某种方式捕获它。

您能再解释一下吗?这是在2D还是3D空间中,您能举一个代码示例,您的矩阵是什么样子的?这些矩阵存储旋转数据吗(可能应该是四元数)或者他们在描述变换??谢谢ross,我目前正在尝试将答案付诸实践。过一会儿会让你知道我的进展……图像现在被破坏了,使答案变得不那么易懂:(我会检查我的备份并找到它。实际上,它与我正在寻找的Y轴相对for@james.ingham:希望有帮助。@james
arctan
在某些角度有问题(例如,如果存在被零除的情况)。这就是为什么有
atan2
可以正确处理棘手的情况。这是真的,但是在我的代码中运行atan2对设备来说太多了,并且导致了很多缓慢的行为。我必须感谢你,因为这是我的论文,我必须谈谈不同的做事方法!ar和atan2之间的区别是什么ctan和反切线?说它们是一样的(就像我想的那样)。。。
float dotProduct(CGPoint p1, CGPoint p2) { return p1.x * p2.x + p1.y * p2.y; }

float getAngle(CGPoint A, CGPoint O, CGPoint B)
{
    CGPoint U = makeVec(O, A);
    CGPoint V = makeVec(O, B);

    float magU = vecGetMag(U);
    float magV = vecGetMag(V);
    float magUmagV = magU * magV;   assert (ABS(magUmagV) > 0.00001);

    // U.V = |U| |V| cos t
    float cosT = dotProduct(U, V) / magUmagV;
    float theta = acos(cosT);
    return theta;
}