Точки на (не)повернутом прямоугольнике

Я нашел отличный вопрос и ответ, который начинается с x/y (плюс center x/y и degrees/radians) и вычисляет повернутое значение x'/y'. Этот расчет работает отлично, но я хотел бы запустить его в обратном направлении; начиная с x'/y' и degrees/radians, я хотел бы рассчитать исходные x/y и center 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.

Схема А и Б

Приведенный выше код будет определять пункт назначения x/y (зеленый кружок) через iDegrees * -1 (благодаря ответу @andrew cooke, который с тех пор был им удален), но для этого мне нужно ввести в него местоположение пункта назначения. center x/y (зеленая звездочка), и это расчеты, которые мне сейчас не хватает, как вы можете видеть на диаграмме C ниже:

Диаграмма C

Итак... как мне найти координаты ?/? (зеленая звезда) по данным n, A (угол) и x'/y' (красный кружок)?


person Campbeln    schedule 08.05.2012    source источник


Ответы (1)


Вы пытаетесь найти обратное преобразование. Вы начинаете с композиции двух линейных преобразований, перемещения T и поворота R. Сначала вы применяете R к вектору x, а затем T, поэтому выражение равно y = TRx. Для решения обратной задачи вам понадобится обратная TR, записанная (TR)-1, которая равна R-1T-1 . Обратное вращение R - это просто вращение на отрицательный угол (о котором вы упоминаете). Инверсия перевода — это аналог исходного перевода, умноженного на -1. Таким образом, ваш ответ: x = R-1T-1y.

В вашей нынешней ситуации вам дан поворот посредством его угла, но вам нужно будет вычислить сдвиг. Вам понадобится серый кружок, который, как вы думали, вам не понадобится. Примените вращение R (не обратное) к серому кругу. Вычтите эту точку из красного круга. Это исходный перевод T. Поменяйте знак, чтобы получить T-1.

person eh9    schedule 04.11.2012