【问题标题】:How to get the bounding rectangle after rotate at a its conner from P1 to P1'?如何在从 P1 到 P1' 的角处旋转后获得边界矩形?
【发布时间】:2011-04-12 15:21:09
【问题描述】:

请关注下图:

我想转换一个矩形,锚点是它的中心,从 P1 到 P1' 点。

我想计算旋转后的边界矩形。

我使用的解决方案是获得新的 4 点:P1 => P1' 和 P2 => P2' 等... 但问题是:矩形(我期望得到)更大。 请告诉我正确获取它的方法。

谢谢。

【问题讨论】:

  • 我假设你知道如何计算旋转本身?一旦你知道 P1' 等,边界框本身就会被简单地计算出来
  • @Johnsyweb:问题是,我已经像 Andrey 的下面第一个答案一样计算了,但我得到的边界矩形更大。我不知道为什么?也许,我会再更新一张图片以了解详细信息。
  • 您是否尝试过我的计算新顶点的解决方案?

标签: c++ algorithm graphics


【解决方案1】:
left = min (Pi'.X for 1<=i<=4)
bottom = min (Pi'.Y for 1<=i<=4)
right = max (Pi'.X for 1<=i<=4)
top = max (Pi'.Y for 1<=i<=4)
width = top - bottom
height = right - left
bounding_rectangle = [left, bottom, width, height]

更新:

将点p 围绕center 旋转angle 弧度:

v.x = p.x - center.x
v.y = p.y - center.y
newp = center.x + cos(angle) * v.x - sin(angle) * v.y, center.y + sin(angle) * v.x + cos(angle) * v.y

将这个应用到你得到的每个 Pi'

【讨论】:

  • 你能告诉我我是如何得到 Pi' 的吗?旋转角度如何?因为,我正在编写一个使用鼠标旋转的功能。当我点击 conner 并将鼠标移动到 P'。我需要画一个新的矩形和它的边界?
  • 非常感谢您的回答。我对你做了同样的事情......这真的是一个很好的解决方案。也许,问题出在用浮点数计算。我会再检查一遍再告诉你。
  • 我认为您对 newp 的计算不正确。请注意,旋转是围绕矩形的中心进行的。您的解决方案对于围绕边缘中心旋转是正确的。
  • 非常感谢您指出这一点!我的错误,我纠正了迹象
  • widthheight 在您的解决方案中切换。它应该是:width = right-leftheight = top-bottom
【解决方案2】:
double halfDiagonal = sqrt((center.x - P1.x)*(center.x - P1.x) + (center.y - P1.y)*(center.y - P1.y));
double newAngle = rotationAngle + atan2(P1.y - center.y, P1.x - center.x);
newP1.x = center.x + halfDiagonal * cos(newangle);

剩下的坐标和最小值/最大值的计算留给读者练习。

【讨论】:

  • 非常感谢您的回答。我知道你想告诉我什么。
猜你喜欢
  • 1970-01-01
  • 2018-12-29
  • 2019-06-01
  • 1970-01-01
  • 2021-11-11
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
相关资源
最近更新 更多