2012-05-08 61 views
1

我發現this excellent question and answerx/y(加上center x/ydegrees/radians)開始,並計算旋轉到x'/y'。這個計算完美,但我想運行在相反的方向;從x'/y'degrees/radians開始,我想計算原始的x/ycenter x/y點上的(未)旋轉矩形

(x', y') = new position 
(xc, yc) = center point things rotate around 
(x, y) = initial point 
theta = counterclockwise rotation in radians (radians = degrees * Pi/180) 
dx = x - xc 
dy = y - yc 

x' = xc + dx cos(theta) - dy sin(theta) 
y' = yc + dx sin(theta) + dy cos(theta) 

或者,在JavaScript/jQuery的:

XYRotatesTo = function($element, iDegrees, iX, iY, iCenterXPercent, iCenterYPercent) { 
    var oPos = $element.position(), 
     iCenterX = ($element.outerWidth() * iCenterXPercent/100), 
     iCenterY = ($element.outerHeight() * iCenterYPercent/100), 
     iRadians = (iDegrees * Math.PI/180), 
     iDX = (oPos.left - iCenterX), 
     iDY = (oPos.top - iCenterY) 
    ; 

    return { 
     x: iCenterX + (iDX * Math.cos(iRadians)) - (iDY * Math.sin(iRadians)), 
     y: iCenterY + (iDX * Math.sin(iRadians)) + (iDY * Math.cos(iRadians)) 
    }; 
}; 

上面的數學/代碼解決了在圖A的情況;它基於x/y(紅色圓圈),center x/y(藍色星)和degrees/radians的已知值計算目的地x'/y'(綠色圓圈)的位置。

但我需要數學/代碼來解決圖B;在這裏我不僅可以找到從起始x/y的已知值目的地x/y(綠圈),而且目的地center x/y(綠星)(灰色圓圈,雖然可能不需要),目的地x'/y' (紅圈)和degrees/radians

Diagram A and B

上面的代碼將通過iDegrees * -1爲目標x/y(綠圈)解決(感謝@andrew這已經被他刪除庫克的回答),但爲了做到這一點,我需要喂到它的目的地center x/y(綠星)的位置,這是我目前缺少的計算,你可以在圖C見,下面:

Diagram C

那麼......是嗎?找到座標?/?(綠色星號)n,A(角度)和x'/y'(紅色圓圈)?

回答

0

您正在嘗試查找逆轉換。從兩個線性變換,一個平移T和一個旋轉R的組合開始。首先將R應用於矢量x和T秒,所以表達式爲y = TRx。爲了解決逆問題,您需要TR的倒數,寫入(TR)-1,其等於R -1 T -1。旋轉R的倒數就是角度的負值(你提到的)的旋轉。翻譯的倒數同樣是原始翻譯乘以-1。所以你的答案是x = R -1 T -1 y。

在你現在的情況下,你可以通過它的角度給出旋轉,但是你需要計算翻譯。你需要一個灰色圓圈,你認爲你不需要它。將旋轉R(不是其倒數)應用於灰色圓圈。從紅色圓圈中減去這一點。這是原來的翻譯T.反向標誌得到T -1