旋转计算算法

时间:2011-03-05 16:53:25

标签: algorithm geometry

我正在尝试计算从一个十字架到另一个十字架的旋转。十字架中的线之间的对应关系是已知的。

旋转需要在顺时针或逆时针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;
                }

有关如何改进或更改算法的任何想法,以便确定任何数量的轮换?

1 个答案:

答案 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);
}

减法的工作方式与您认为的方式相同。该算法应易于适应非面向对象的方法。