0

我有一个从 +PI 到 -PI 弧度的数据值。

我需要获得从旧值到新值所需的最小旋转(以弧度为单位),例如:

float rotationRequired(float oldValue, float newValue){
      return newValue - oldValue;
}

但简单地减去是行不通的,因为从 -179 度到 +179 度不需要旋转一整圈,只需顺时针旋转 2 度。因为 -PI = +PI 在一个圆圈中在技术上是相同的旋转。此外,这些值可以在任何范围内,即 740 = 360 + 360 + 20,因此只有 20。

我正在考虑将值分解为sincos,然后减去atan

double oldY =  Math.sin(oldValue);
double oldX =  Math.cos(oldValue);

double newY =  Math.sin(newValue);
double newX =  Math.cos(newValue);

float delta = (float) Math.atan2( (newY - oldY),(newX - oldX) );

但是它仍然没有给出正确的结果,有人可以提出另一种方法吗?

4

2 回答 2

2

只需进行减法,然后根据需要通过添加或减去 360 将结果限制为 +/-180(%操作员可能会在这里提供帮助...)

于 2013-01-29T16:56:24.727 回答
0

我将角度转换为度数,并使用这种方法来建议需要的最小旋转以及方向:

public static int suggestRotation(int o, int n){
    //--convert to +0 to +360 range--
    o = normalize(o);
    n = normalize(n);

    //-- required angle change --
    int d1 = n - o;

    //---other (360 - abs d1 ) angle change in reverse (opp to d1) direction--
    int d2 = d1 == 0 ? 0 : Math.abs(360 - Math.abs(d1))*(d1/Math.abs(d1))*-1;

    //--give whichever has minimum rotation--
    if(Math.abs(d1) < Math.abs(d2)){
        return d1;
    }else {
        return d2;
    }

}

private static int normalize(int i){
    //--find effective angle--
    int d = Math.abs(i) % 360;

    if(i < 0){
    //--return positive equivalent--
        return 360 - d;
    }else {
        return d;
    }
}
于 2013-01-29T20:52:51.727 回答