Lia*_*Kai 19 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 = 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
是矩形的逆时针旋转,其大小x
为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))
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
首先,考虑将长度bx
切成两块,a
并b
在矩形的一角切割.使用三角来表达bx
来讲x
,y
和theta
:
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)
[ 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)
[ 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)
非常简单!
归档时间: |
|
查看次数: |
14097 次 |
最近记录: |