22

回転した四角形からバウンディング ボックスの座標を計算するを読んで、回転した四角形からバウンディング ボックスの座標を計算する方法を知りました。ただし、次の画像のような特別な場合:

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

バウンディングボックスのサイズ、座標、回転度を取得した場合、回転した長方形のサイズを取得する方法は?

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;

しかし...答えはwとhが一致しません

4

2 に答える 2

52

ここに画像の説明を入力してください

解決

バウンディングボックスの寸法を次のように指定bxするbyt、次のサイズの長方形が反時計回りに回転xyます。

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

導出

どうしてこれなの?

まず、長さが長方形の角でbx2つにカットされaていることを考慮してください。b三角法を使用して、、、および:で表現bxします。xytheta

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

同様にby

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

12は、次のように行列形式で表すことができます。

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

行列はほぼ回転行列であることに注意してください(ただし、完全ではありません。マイナス記号でずれています)。

行列を両側で左分割し、次のようにします。

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

逆行列は、2x2行列の評価が簡単で、次のように展開されます。

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

[5]は2つの式を与えます:

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

やさしい!

于 2012-04-02T07:55:30.757 に答える
-1

ポイント座標を見つけるには、おそらくアフィン変換のようなものが必要になるでしょう。次に、標準の幾何学公式を使用してサイズを計算します。

于 2012-04-02T05:25:14.543 に答える