从已知的边界框坐标计算旋转的矩形大小

Lia*_*Kai 19 math geometry rotation bounding-box

从旋转的矩形中读取了" 计算边界"框的坐标,以了解如何从旋转的矩形计算边界框坐标.但在特殊情况下如下图:

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;
Run Code Online (Sandbox Code Playgroud)

但是......答案与w和h不匹配

Li-*_*Yip 42

在此输入图像描述

给定边界框尺寸bx,by并且t是矩形的逆时针旋转,其大小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))
Run Code Online (Sandbox Code Playgroud)

求导

为什么是这样?

首先,考虑将长度bx切成两块,ab在矩形的一角切割.使用三角来表达bx来讲x,ytheta:

bx = b          + a
bx = x * cos(t) + y * sin(t)            [1]
Run Code Online (Sandbox Code Playgroud)

同样适用于by:

by = c          + d
by = x * sin(t) + y * cos(t)            [2]
Run Code Online (Sandbox Code Playgroud)

12可以矩阵形式表示为:

[ bx ] = [ cos(t)  sin(t) ] * [ x ]     [3]
[ by ]   [ sin(t)  cos(t) ]   [ y ]
Run Code Online (Sandbox Code Playgroud)

请注意,矩阵几乎是一个旋转矩阵(但不完全 - 它是一个减号.)

左侧划分矩阵,给出:

[ x ] = inverse ( [ cos(t)  sin(t) ]    * [ bx ]                        [4]
[ y ]             [ sin(t)  cos(t) ] )    [ by ]
Run Code Online (Sandbox Code Playgroud)

对于2x2矩阵,矩阵求逆很容易评估,并扩展为:

[ x ] = (1/(cos(t)^2-sin(t)^2)) * [ cos(t) -sin(t) ] * [ bx ]           [5]
[ y ]                             [-sin(t)  cos(t) ]   [ by ]
Run Code Online (Sandbox Code Playgroud)

[5]给出了两个公式:

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))
Run Code Online (Sandbox Code Playgroud)

非常简单!

  • @HighPerformanceMark:回答问题所花费的时间和精力与问题的有趣程度成正比.这个[书呆子狙击](http://xkcd.com/356/)我.;) (2认同)
  • @anna.mi 对于 45°,没有逆矩阵。请参阅http://www.mathsisfun.com/algebra/matrix-inverse.html - 逆矩阵可能不存在。我假设您必须使用下面提到的仿射变换方法。 (2认同)