我需要从4个角定义一个旋转的矩形。旋转的矩形由中心点,尺寸对(宽度,高度)和角度定义。
如何确定哪个尺寸是高度,哪个是宽度?
宽度不是最水平边缘的长度,是吗?例如。如果角度大于90°,它是否交换?
答案 0 :(得分:2)
height
应该是最大的一面,width
是另一面,而angle
是顺时针方向的旋转角度(以度为单位)。
否则,您可以获得一个等效的矩形,其中height
和width
交换,旋转90度。
您可以使用minAreaRect
查找RotatedRect
:
vector<Point> pts = {pt1, pt2, pt3, pt4}
RotatedRect box = minAreaRect(pts);
// Be sure that largest side is the height
if (box.size.width > box.size.height)
{
swap(box.size.width, box.size.height);
box.angle += 90.f;
}
答案 1 :(得分:0)
好的,在Miki的帮助下,通过一些测试,我明白了......
似乎旋转的矩形是一个直立的矩形(宽度和高度已明确定义,然后)......旋转了!
在图像坐标中,y指向底部,角度顺时针方向。在通常的数学坐标系(y到顶部)中,角度是逆时针方向。然后,它适合于c ++ <math.h>
包含atan2(y,x)
函数(除了它返回弧度)。
然后,总而言之,如果我们考虑矩形的一个给定边(两个角),如果我们在其y差和x差上检索atan2
的角度,则可以将其长度视为宽度。类似的东西:
Point pt1, pt2, pt3, pt4;
RotatedRect rect;
rect.center = (pt1 + pt2 + pt3 + pt4)/4;
// assuming the points are already sorted
rect.size.width = distance(pt1, pt2); // sqrt(...)
rect.size.height = distance(pt2, pt3);
rect.angle = atan2(pt2.y-pt1.y, pt2.x-pt1.x);
这可以通过width
作为dist(pt1,pt2)
和dist(pt3,pt4)
的平均值来改进。 height
也是如此。
angle
也可以计算为(pt1,pt2)的atan
和(pt3,pt4)的atan
的平均值。