2012-04-02 24 views
16

czytam http://goo.gl/HKMtO wiedzieć jak obliczyć współrzędne ograniczająca pole z obróconym rectangle.But w szczególnym przypadku, obserwacji obrazu:Oblicz obrócony prostokąt wielkości od znanego obwiedni współrzędne

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

Jak zdobyć obróconego rozmiaru prostokąta, jeśli miał rozmiar obwiedni, corrdinates i obrócić stopień?

próbuję napisać kod w 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; 

... Ale odpowiedź nie jest dopasować Sz i

+0

Czy masz theta? –

+0

co masz na myśli przez "rozmiar prostokąta"? jeśli obrócisz obiekt, otrzymasz, no cóż, ten sam obiekt obrócony ... te same długości, ten sam obszar ...jeśli masz wynik obrotu, a nie oryginalny obiekt, po prostu użyj współrzędnych (mówisz, że je masz), obliczając odległości między "punktami narożnymi", aby uzyskać długość każdej strony. – ShinTakezou

+0

Zakładam, że w odniesieniu do Twojego "Case Image" masz 'bh',' bw' i 'theta', i chcesz' w' i 'h'? –

Odpowiedz

33

enter image description here

Rozwiązanie

Podane wymiary obwiedni bx przez by i t będące obrót w lewo prostokąta o wymiarach x przez 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)) 

Wyprowadzenie

Dlaczego th jest?

Najpierw należy wziąć pod uwagę, że długość bx jest pocięta na dwie części, a i b, za róg prostokąta. Używać trygonometrii wyrazić bx pod względem x, y i theta:

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

podobnie dla by:

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

1 i 2 może być wyrażona w postaci macierzowej jako:

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

Należy zauważyć, że matryca to prawie macierzą rotacji (ale nie całkiem - to się znakiem minus).

zostawienie podzielić macierz po obu stronach, co daje:

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

Odwrotność macierzy jest easy to evaluate for a 2x2 matrix i rozszerza się do:

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

[5] daje dwa wzory:

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

Łatwe jak ciasto!

+0

I to właśnie uczy 5 lat matematyki na poziomie uniwersyteckim. : P –

+0

+1: Li-aung Yip: wstydźcie się ilością czasu i wysiłku, które włożyliście w tę odpowiedź. –

+2

@HighPerformanceMark: Czas i wysiłek spędzony na odpowiadaniu na pytania jest proporcjonalny do tego, jak interesujące jest to pytanie. Ten [frajer snajper] (http://xkcd.com/356/) mnie. ;) –

0

Prawdopodobnie będziesz potrzebował czegoś podobnego affine transformation odkryć współrzędne punktu. A następnie za pomocą standardowych formuł geometrii obliczyć rozmiar.

+0

Transformacja afiniczna jest bardzo ogólnym przypadkiem obrotu. W takim przypadku wymagana jest tylko prosta trygonometria. ;) –

+0

Choć znajomość afinii nie zaszkodzi :) –

Powiązane problemy