我正在尝试计算从一个十字架到另一个十字架的旋转。十字架中的线之间的对应关系是已知的。
旋转需要在顺时针或逆时针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 :(得分: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);
}
减法的工作方式与您认为的方式相同。该算法应易于适应非面向对象的方法。