2011-03-05 87 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