2012-04-02 4 views
16

Я прочитал http://goo.gl/HKMtO, чтобы знать, как рассчитать ограничивающее окно координат с повернутой rectangle.But в особом случае, как последующие изображения:Вычислить повернут размером прямоугольника из известного ограничивающего параллелепипеда координаты

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

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

Я пытаюсь написать код в 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; 

... Но ответ не соответствует ш и ч

+0

У вас есть тэта? –

+0

Что вы подразумеваете под «прямоугольником размера»? если вы повернете объект, вы получите, ну, тот же объект повернут ... такие же длины, в той же области ...если у вас есть результат вращения, а не исходный объект, просто используйте координаты (вы говорите, что у вас есть), вычисляя расстояния между «угловыми точками», чтобы получить длину каждой стороны. – ShinTakezou

+0

Я предполагаю, что со ссылкой на ваш «Образ случая» у вас есть 'bh',' bw' и 'theta', и вы хотите' w' и 'h'? –

ответ

33

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 ] 

Матрица обратное easy to evaluate for a 2x2 matrix и расширяется:

[ 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

И вот что пять лет математики на уровне университета учит вас, как это сделать. : P –

+0

+1: Li-aung Yip: вы меня постыдили с количеством времени и усилий, которые вы вложили в этот ответ. –

+2

@HighPerformanceMark: Время и усилия, проведенные с ответом на вопросы, пропорциональны тому, насколько интересен вопрос. Этот [ботаник снайпед] (http://xkcd.com/356/) меня. ;) –

0

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

+0

Аффинное преобразование - очень общий случай вращения. В этом случае требуется только простая тригонометрия. ;) –

+0

Хотя знание об аффине не повредит :) –