2012-04-02 7 views
16

ho letto il http://goo.gl/HKMtO per sapere come calcolare le coordinate di delimitazione area da un rectangle.But ruotato in un caso speciale immagine segue come:Calcolare ruotato dimensioni rettangolo dal noto casella di delimitazione coordinate

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

Come arrivare la dimensione del rettangolo ruotato se avesse ottenuto le dimensioni del riquadro di delimitazione, si corresse e ruotasse di un grado?

provo scrivere il codice in 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; 

Ma ... la risposta non è corrispondono w e h

+0

Hai theta? –

+0

cosa intendi per "dimensione del rettangolo"? se si ruota un oggetto, si otterrà, beh, lo stesso oggetto ruotato ... stesse lunghezze, stessa area ...se hai il risultato della rotazione e non l'oggetto originale, usa le coordinate (dici di averle), calcolando le distanze tra i "punti d'angolo" per ottenere la lunghezza di ciascun lato. – ShinTakezou

+0

Suppongo, con riferimento alla tua "Immagine del caso", che tu abbia 'bh',' bw' e 'theta', e tu voglia' w' e 'h'? –

risposta

33

enter image description here

Solution

Dato dimensione dell'imballo bx da by e t essendo la rotazione antioraria del rettangolo di dimensioni x da 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)) 

Derivazione

Perché th è?

Innanzitutto, si consideri che la lunghezza bx viene tagliata in due pezzi, a e , con l'angolo del rettangolo. Usare la trigonometria per esprimere bx in termini di x, y e theta:

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

e analogamente per by:

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

1 e 2 può essere espressa in forma matriciale:

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

Si noti che la matrice è quasi una matrice di rotazione (ma non abbastanza - è fuori dal segno meno.)

sinistro dividere la matrice su entrambi i lati, dando:

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

La matrice inversa è easy to evaluate for a 2x2 matrix e si espande a:

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

[5] dà le due formule:

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

Facile come torta!

+0

E questo è ciò che cinque anni di matematica a livello universitario ti insegna come fare. : P –

+0

+1: Li-aung Yip: mi fai vergognare con la quantità di tempo e impegno che hai messo in questa risposta. –

+2

@HighPerformanceMark: tempo e impegno spesi a rispondere alle domande è proporzionale a quanto sia interessante la domanda. Questo [nerd sniped] (http://xkcd.com/356/) questo me. ;) –

0

Avrete probabilmente bisogno di qualcosa come affine transformation per scoprire coordinate del punto. E poi usando le formule geometriche standard calcola la dimensione.

+0

Una trasformazione affine è un caso di rotazione molto generale. In questo caso è richiesta solo la semplice trigonometria. ;) –

+0

Anche se conoscere affine non farebbe male :) –