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:
¿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
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))
¿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.