(未)旋转矩形上的点

时间:2012-05-08 23:41:32

标签: javascript algorithm geometry bounding-box

我发现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'(红色圆圈),x的已知值计算目标y / center x/y(绿色圆圈)的位置(蓝色星)和degrees/radians

但我需要数学/代码来解决图B;我不仅可以从起始x /的已知值找到目的地y / center x/y(绿色圆圈),还可以找到目的地x(绿色星星) y(灰色圆圈,但可能不需要),目标x' / y'(红圈)和degrees/radians

Diagram A and B

上面的代码将通过x解决目标y / iDegrees * -1(绿色圆圈)(感谢@andrew cooke的答案,此后他已将其删除),但是为了做到这一点,我需要在其中输入目的地center x/y(绿色星)的位置,这就是我目前缺少的计算,如下图C所示:

Diagram C

那么......如何找到给定??(角度)和n /的坐标A / x'(绿色星) y'(红色圆圈)?

1 个答案:

答案 0 :(得分: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