Calcule el tamaño del rectángulo girado a partir de las coordenadas del cuadro delimitador conocidas

Leí el http://goo.gl/HKMtO para saber cómo calcular las coordenadas del cuadro delimitador a partir de un rectángulo girado. Pero en un caso especial como la siguiente imagen:

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

¿Cómo obtener el tamaño de rectángulo girado si hubiera obtenido el tamaño del cuadro delimitador, corrige y gira el grado?

Intento escribir el código en 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; 

Pero … la respuesta no coincide con w y h

enter image description here

Solución

Se dan las dimensiones de la caja delimitadora bx por bx siendo la rotación en sentido antihorario de un rectángulo de tamaño x por 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)) 

Derivación

¿Por qué es esto?

Primero, considere que la longitud bx se corta en dos piezas, a y b , por la esquina del rectángulo. Usa la trigonometría para express bx en términos de x , y y theta :

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

y de manera similar by :

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

1 y 2 se pueden express en forma de matriz como:

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

Tenga en cuenta que la matriz es casi una matriz de rotación (pero no del todo, está desactivada por un signo menos).

Divide a la izquierda la matriz en ambos lados, dando:

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

La matriz inversa es fácil de evaluar para una matriz de 2×2 y se expande a:

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

[5] da las dos fórmulas:

 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)) 

¡Muy fácil!

Probablemente necesites algo así como una transformación afín para descubrir las coordenadas del punto. Y luego, usando fórmulas de geometría estándar, calcule el tamaño.