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

我在C ++中编码一个10x10的网格单元中的简单多边形(即矩形,L形等多边形)的平移和旋转。

假设我有一个宽度= 1单元格和高度= 3单元格的矩形。轻松在8个方向上进行翻译。但是,如果我想将此多边形旋转45º,就可以得到它,但是我想计算出哪些矩形现在占据或部分占据。

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

非常感谢你!

最佳答案

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

以矩形的四个角为例,这些角的x,y坐标是它们所占据的单元格编号,例如对于以width = 1 cell为中心的height = 3 cellso(2,2)矩形,这四个以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 and min x and y,它们将代表矩形所占据的单元格。其他凸多边形也可以做类似的事情。

更新:
正如Fang所评论的那样,要获得旋转后的多边形所占据的单元格的准确数量,您仍然需要对边界框内的所有正方形单元格进行正方形与多边形的交点检查-您可以看一下-

How to check intersection between 2 rotated rectangles?

10-07 15:33