Как нормализовать вращение до нуля - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть повернутый прямоугольник на 2d поверхности

enter image description here

Известные значения:

  • x, y (верхний левый угол)
  • ширина / высота прямоугольника
  • вращение

Как я могу повернуть прямоугольник обратно в ноль, при этом точка начала координат является центром прямоугольника ...

... а затем получить новые значения x, y верхнего левого угла прямоугольника?

enter image description here

пример функции php:

    function getPositionWithoutRotation(
        float $rotation,
        float $x,
        float $y,
        float $width,
        float $height
    ) {
        $angleRadian = ($rotation * pi()) / 180;

        $xRelativeToCenter = ($width / 2) * cos($angleRadian) - ($height / 2) * sin($angleRadian);
        $yRelativeToCenter = ($width / 2) * sin($angleRadian) + ($height / 2) * cos($angleRadian);

        $cx = $x - $xRelativeToCenter;
        $cy = $y - $yRelativeToCenter;

        $x0 = $cx + ($width / 2);
        $y0 = $cy + ($height / 2);

        return [
            'x0' => $x0,
            'y0' => $y0,
        ];
    }

результат:

enter image description here

данные:

x = 453
y = 244
w = 139
h = 139
rotation = 16

angleRadian = 0.27925268031909

xRelativeToCenter = 47.650891638432
yRelativeToCenter = 85.964484096995

cx = 405.34910836157
cy = 158.03551590301

x0 = 474.84910836157
y0 = 227.53551590301

1 Ответ

0 голосов
/ 12 ноября 2018

Редактировать: перепроверенные знаки для левого верхнего угла

По сути, вам нужно определить центр прямоугольника (и вращения).

Пусть полуширина прямоугольника равна w, половина высотыh.Таким образом, угловые координаты относительно центра после поворота на угол fi равны

x' =  -w * cos(fi) - h * sin(fi)
y' =  -w * sin(fi) + h * cos(fi)

, а центр равен

 cx = x - x'
 cy = y - y'

И угловые координаты без вращения:

x0 = cx - w
y0 = cy + h

Код Python:

import math
def getPositionWithoutRotation(rotation, x, y, width, height):
    angleRadian = (rotation * math.pi) / 180

    xRelativeToCenter = - (width / 2) * math.cos(angleRadian) - (height / 2) * math.sin(angleRadian)
    yRelativeToCenter = -(width / 2) * math.sin(angleRadian) + (height / 2) * math.cos(angleRadian)

    cx = x - xRelativeToCenter
    cy = y - yRelativeToCenter

    x0 = cx - (width / 2)
    y0 = cy + (height / 2)

    return x0, y0

print(getPositionWithoutRotation(-30, -0.37, 1.37, 2, 2))
print(getPositionWithoutRotation(16, 453, 244, 139, 139))

(-1.0039745962155613, 1.0039745962155615)  //OK
(469.4644840969946, 265.84910836156826)    // ????
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...