Рассчитать размер повернутого прямоугольника по известным координатам ограничительной рамки - PullRequest
19 голосов
/ 02 апреля 2012

Я прочитал Рассчитать координаты ограничивающего прямоугольника из повернутого прямоугольника , чтобы узнать, как вычислить координаты ограничивающего прямоугольника из повернутого прямоугольника.Но в особом случае, как показано на рисунке:

http://i.stack.imgur.com/3UNfD.png

Как получить размер повернутого прямоугольника, если он получил размер ограничивающего прямоугольника, координаты и степень поворота?Я пытаюсь написать код в javascript

//assume w=123,h=98,deg=35 and get calculate box size
var deg = 35;
var bw = 156.9661922099485;
var bh = 150.82680201149986;

//calculate w and h
var xMax = bw / 2;
var yMax = bh / 2;
var radian = (deg / 180) * Math.PI;
var cosine = Math.cos(radian);
var sine = Math.sin(radian);
var cx = (xMax * cosine) + (yMax * sine)   / (cosine * cosine + sine * sine);
var cy =  -(-(xMax * sine)  - (yMax * cosine) / (cosine * cosine + sine * sine));
var w = (cx * 2 - bw)*2;
var h = (cy * 2 - bh)*2;

Но ... ответ не совпадает с w и h

Ответы [ 2 ]

42 голосов
/ 02 апреля 2012

enter image description here

Решение

При заданных размерах ограничивающего прямоугольника bx на by и t - это вращение против часовой стрелки прямоугольника размером x на y:

x = (1/(cos(t)^2-sin(t)^2)) * (  bx * cos(t) - by * sin(t))
y = (1/(cos(t)^2-sin(t)^2)) * (- bx * sin(t) + by * cos(t))

Деривация

Почему это так?

Сначала рассмотрим, что длина bx разрезана на две части, a и b, наугол прямоугольника.Используйте тригонометрию для выражения bx в терминах x, y и theta:

bx = b          + a
bx = x * cos(t) + y * sin(t)            [1]

и аналогично для by:

by = c          + d
by = x * sin(t) + y * cos(t)            [2]

1 и 2 могут быть выражены в матричной форме как:

[ bx ] = [ cos(t)  sin(t) ] * [ x ]     [3]
[ by ]   [ sin(t)  cos(t) ]   [ y ]

Обратите внимание, что матрица является почти матрицей вращения (но не совсем -он выключается знаком минус.)

Разделите влево матрицу с обеих сторон, давая:

[ x ] = inverse ( [ cos(t)  sin(t) ]    * [ bx ]                        [4]
[ y ]             [ sin(t)  cos(t) ] )    [ by ]

Обратная матрица легко оценить для матрицы 2x2 и расширяется до:

[ x ] = (1/(cos(t)^2-sin(t)^2)) * [ cos(t) -sin(t) ] * [ bx ]           [5]
[ y ]                             [-sin(t)  cos(t) ]   [ by ]

[5] дает две формулы:

x = (1/(cos(t)^2-sin(t)^2)) * (  bx * cos(t) - by * sin(t))             [6]
y = (1/(cos(t)^2-sin(t)^2)) * (- bx * sin(t) + by * cos(t))

Легко, как пирог!

0 голосов
/ 02 апреля 2012

Вам, вероятно, понадобится что-то вроде аффинного преобразования , чтобы обнаружить координаты точки.А затем с помощью стандартных геометрических формул рассчитать размер.

...