【问题标题】:Rotation Calculation Algorithm旋转计算算法
【发布时间】:2011-07-09 11:30:30
【问题描述】:

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

旋转需要在 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 和 360 之间,则使用模运算符 (%) 确保它在该范围内:int deg = val % 360;' - that will take a value in val` 并通过除以 @987654323 确保它在 360 范围内@ 乘以 360,并将余数分配给 deg
  • 作为一个方位,它总是在 360 度以内,但是由于上述算法会检查每条对应线之间的角度以计算平均值,因此方位的某些变化不能提供正确的旋转

标签: algorithm geometry


【解决方案1】:

如果我理解正确,您想找到两个向量之间的最小角度,其中向量以度数的方位角表示。如果是这种情况,您应该可以使用以下代码,来自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);
}

减法的工作方式与您想象的一样。该算法应该很容易适应非面向对象的方法。

【讨论】:

    猜你喜欢
    • 2020-07-24
    • 2022-01-24
    • 2018-12-04
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多