math - software - rotation geometry definition
Calcule el tamaño del rectángulo girado a partir de las coordenadas del cuadro delimitador conocidas (2)
Probablemente necesitará algo como una transformación afín para descubrir coordenadas de puntos. Y luego utilizando fórmulas de geometría estándar calcule el tamaño.
Leí las coordenadas del recuadro Calcular límite de un rectángulo girado para saber cómo calcular las coordenadas del recuadro delimitador de un rectángulo girado. Pero en un caso especial como sigue la imagen:
¿Cómo obtener el tamaño del rectángulo girado si hubiera obtenido el tamaño, las coordenadas y el grado de giro del cuadro delimitador?
Intento escribir 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 es match w y h
Solución
Dadas las dimensiones del cuadro delimitador bx
by by
t
siendo la rotación a la izquierda 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, considera que la longitud bx
se corta en dos partes, a
y b
, por la esquina del rectángulo. Usa la trigonometría para expresar 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 expresar 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).
Dividir 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 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!