c++ - 计算多边形在网格中旋转后所占的位置

标签 c++ math rotation grid geometry

我找了一些类似的问题,但我认为没有一个与我的问题相关。

我正在用 C++ 编写 10x10 网格单元格中简单多边形(即矩形、L 形多边形...)的平移和旋转代码。

假设我有一个宽度 = 1 个单元格、高度 = 3 个单元格的矩形。在 8 个方向上翻译它很容易。但是如果我想将这个多边形旋转 45º,我可以得到它,但我想计算哪些单元格现在被矩形占据或部分占据。

我有矩形的质心,即它的一个单元格。我可以根据大小计算旋转前矩形所占的位置。但是,旋转后,我找不到计算矩形所占单元格位置的方法。

非常感谢!

最佳答案

您绝对可以将其视为边界框问题 -

取矩形的四个角,这些角的 x,y 坐标是它们占据的单元格编号 - 例如对于以 o(2,2) 为中心的 width = 1 cellheight = 3 cells 的矩形,这 4 个角表示为 corner(x ,y) 格式为 - a(1.5,3.5) b(2.5,3.5) c(2.5,0.5) d(1.5,0.5)

一旦清楚了这一点,我认为您可能已经理解了剩余的过程,因为它已经在此处多次解释过 -

Calculate Bounding box coordinates from a rotated rectangle

总而言之,将 2D 旋转的标准矩阵应用于这 4 个角并获得新的角,例如

a'.x = o.x + (a.x - o.x) * cos(t) + (a.y - o.y) * sin(t) 
a'.y = o.y - (a.x - o.x) * sin(t) + (a.y - o.y) * cos(t) 

其他点也类似。然后找到 max 和 min x 和 y,它们将代表您的矩形占据的单元格。其他凸多边形也可以做类似的事情。

更新: 正如 Fang 所评论的那样,要获得旋转多边形占据的准确单元数,您仍然需要对边界框内的所有方形单元进行正方形到多边形的交集检查 - 你可以看看这个 -

How to check intersection between 2 rotated rectangles?

关于c++ - 计算多边形在网格中旋转后所占的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28001648/

相关文章:

javascript - 使用 'ScriptEngine'计算公式而不损失任何精度

ios - 移动旋转的 UIButton

c++ - 为已知的更常见路径优化分支

C++/Win32 查找所有键盘输入语言?

math - 二维三重乘积构造垂直线

c++ - 如何将 float 转换为非标准编码

c++ - 在函数模板中将一种类型名称映射到另一种类型名称

c++ - 在 C++ 中使用函数嵌套无捕获 lambda?

java - 一起旋转 ImageView 和 TextView

bash - Shell脚本将矩形文本旋转45°