2011-03-05 253 views
2

我想计算从一个十字架到另一个十字架的旋转。十字架中的线条之间的对应关系是已知的。旋转计算算法

旋转需要在180度内顺时针或逆时针计算,目前我可以在90度内计算,但算法失败的时候会有更大的变化。这个问题似乎是当匹配的轴承经过360度左右时,如A = 350和A'= 80。对十字线的每一行重复此操作会导致计算不正确的总旋转。

目前的算法,如下工作比较两条线间的旋转,从两个十字线是; crossB和crossA是每个十字的相应轴承。

   if ((crossB < 360 && crossB >= 270) 
        && (crossA >= 0 && crossA < 90)) 
       { 
        angle = -((360) - crossB) - crossA; 
       } 
       else if ((crossA < 360 && crossA >= 270) 
        && (crossB >= 0 && crossB < 90) 
       { 
        angle = crossB + (360 - crossA); 
       } 
       else 
       { 
        angle = crossB - crossA; 
       } 

有关如何改进或更改算法的任何想法,以便它将允许任何数量的旋转被确定?

+0

如果你希望你的输入在0到360之间,那么使用模运算符(%)来确保它在这个范围内:'int deg = val%360;' - 这将取得'val'中的一个值,并通过将'val'除以360来确保它在360以内,并将余数分配给'deg'。 – 2011-03-05 16:59:15

+0

由于其轴承始终在360度以内,但是由于上述算法检查每条对应线之间的角度以计算平均值,所以轴承有一定的变化,不提供正确的旋转。 – 2011-03-05 17:04:39

回答

2

如果我理解正确,您希望找到两个向量之间的最小角度,其中向量以方位角表示方位角。如果是这样的话,你应该可以使用下面的代码,从NASA's open source WorldWind project

/** 
* Computes the shortest distance between this and angle, as an angle. 
* 
* @param angle the angle to measure angular distance to. 
* 
* @return the angular distance between this and <code>value</code>. 
*/ 
public Angle angularDistanceTo(Angle angle) 
{ 
    if (angle == null) 
    { 
     String message = Logging.getMessage("nullValue.AngleIsNull"); 
     Logging.logger().severe(message); 
     throw new IllegalArgumentException(message); 
    } 

    double differenceDegrees = angle.subtract(this).degrees; 
    if (differenceDegrees < -180) 
     differenceDegrees += 360; 
    else if (differenceDegrees > 180) 
     differenceDegrees -= 360; 

    double absAngle = Math.abs(differenceDegrees); 
    return Angle.fromDegrees(absAngle); 
} 

减哪里工作,你会觉得它的方式。算法应该很容易适应非面向对象的方法。

+0

好的,谢谢,这是一个尝试=] – 2011-03-05 17:18:45

+0

很好,非常感谢! – 2011-03-05 17:56:05

+0

很高兴为你效劳 – I82Much 2011-03-06 00:40:38