Math 根据已知边界框坐标计算旋转矩形大小

Math 根据已知边界框坐标计算旋转矩形大小,math,geometry,rotation,bounding-box,Math,Geometry,Rotation,Bounding Box,我读了这本书,想知道如何从旋转的矩形计算边界框坐标。但在特殊情况下,如下图所示: 如果已经得到了包围盒的大小、坐标和旋转度,如何得到旋转矩形的大小 我尝试用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 =

我读了这本书,想知道如何从旋转的矩形计算边界框坐标。但在特殊情况下,如下图所示:

如果已经得到了包围盒的大小、坐标和旋转度,如何得到旋转矩形的大小

我尝试用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不匹配

您可能需要类似的东西来发现点坐标。然后使用标准几何公式计算尺寸。

解决方案 给定的边界框尺寸
bx
by
by
t
是矩形尺寸
x
by
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))
起源 为什么会这样

首先,考虑长度<代码> bx<代码>被分割成两个部分,<代码> > < <代码> > <代码> b>代码>,由矩形的角。使用三角学以

x
y
theta
表示
bx

bx = b          + a
bx = x * cos(t) + y * sin(t)            [1]
对于的,类似地:

by = c          + d
by = x * sin(t) + y * cos(t)            [2]
并且可以矩阵形式表示为:

[ 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 ]
矩阵求逆,并展开为:

[ x ] = (1/(cos(t)^2-sin(t)^2)) * [ cos(t) -sin(t) ] * [ bx ]           [5]
[ y ]                             [-sin(t)  cos(t) ]   [ by ]
[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))

容易极了

你说的“矩形尺寸”是什么意思?如果你旋转一个物体,你会得到同样的旋转物体。。。同样的长度,同样的面积。。。如果你得到的是旋转的结果,而不是原始对象,只需使用坐标(你说你有坐标),计算“角点”之间的距离,得到每边的长度。我假设,参考你的“案例图像”,你有
bh
bw
theta
,你想要
w
h
?我认为你的Javascript代码几乎是正确的,但是你有一些加号/减号。参见我的答案。参见:仿射变换是旋转的一种非常普遍的情况。在这种情况下,只需要简单的三角函数虽然知道仿射不会有什么坏处:)我们如何将仿射传输应用到这个特定实例?你能举个例子吗?这就是大学五年的数学课程教你的方法:P+1:Li aung Yip:你为这个答案投入的时间和精力让我感到羞愧。@HighPerformanceMark:回答问题花费的时间和精力与问题的有趣程度成正比。这个是我的@anna.mi对于45º,没有逆矩阵。请参阅-可能不存在相反的情况。我假设你必须使用下面提到的仿射变换方法。为了让你的答案更令人敬畏,请你用另一种方式陈述公式好吗?你看,我需要旋转和裁剪一张图像(围绕我在那里检测到的一张脸),我有你术语中的(x,y),我需要计算(bx,by.)。。。