【问题标题】:Calculate rotated rectangle size from known bounding box coordinates从已知的边界框坐标计算旋转的矩形大小
【发布时间】:2012-04-15 19:21:21
【问题描述】:

我阅读了Calculate Bounding box coordinates from a rotated rectangle 以了解如何从旋转的矩形计算边界框坐标。但在特殊情况下如下图:

如果已经获得了边界框大小、坐标和旋转度数,如何获得旋转后的矩形大小?

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

【问题讨论】:

  • “矩形大小”是什么意思?如果您旋转一个对象,您将获得相同的对象旋转...相同的长度,相同的面积...如果您有旋转的结果而不是原始对象,只需使用坐标(你说你有它们),计算“角点”之间的距离以获得每条边的长度。
  • 我假设,参考您的“案例图片”,您有bhbwtheta,并且您想要wh?跨度>
  • 我认为您的 Javascript 代码几乎是正确的,但您偏离了几个加号/减号。看我的回答。

标签: math geometry rotation bounding-box


【解决方案1】:

解决方案

给定边界框尺寸bx by byt 是矩形大小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被矩形的角切成两段,ab。用三角函数将bxxytheta表示:

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 ]

矩阵逆为easy to evaluate for a 2x2 matrix,展开为:

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

简单易行!

【讨论】:

  • 这就是五年大学数学教给你的方法。 :P
  • +1:Li-aung Yip:你在这个答案中投入的时间和精力让我感到羞耻。
  • @HighPerformanceMark:回答问题所花费的时间和精力与问题的有趣程度成正比。这个nerd sniped我。 ;)
  • @anna.mi 对于 45º,没有逆矩阵。请参阅mathsisfun.com/algebra/matrix-inverse.html - 逆可能不存在。我假设您必须使用下面提到的仿射变换方法。
  • 为了让您的答案更加精彩,您是否愿意反过来说明公式?你看,我需要旋转和裁剪图像(围绕我在那里检测到的一张脸),我在你的术语中有 (x,y),我需要计算 (bx,by.)...
【解决方案2】:

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

【讨论】:

  • 仿射变换是一种非常普遍的旋转情况。在这种情况下,只需要简单的三角函数。 ;)
  • 虽然知道仿射不会伤害:)
  • 我们如何将仿射传输应用到这个特定的实例?可以举个例子吗?
猜你喜欢
  • 2010-10-11
  • 2019-01-05
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 2015-06-18
  • 2021-11-11
相关资源
最近更新 更多