从多边形的4个点计算宽度和高度

6
我有四个点组成一个矩形,并允许用户移动任何一个点以及旋转矩形(旋转每个点围绕中心点)。它保持近乎完美的矩形形状(PointF精度范围内)。这是我的“矩形”的示例,由四个点绘制: enter image description here 然而,我需要能够获取点之间的宽度和高度。当矩形未旋转时很容易,但一旦旋转,我的计算返回红色轮廓所示的宽度和高度: enter image description here 假设我知道点的顺序(例如从左上角按顺时针方向),如何检索它们所代表的矩形的宽度和高度?

1
这实际上更多是一个几何问题。您可以取前三个点并计算边的长度。如果您想稍微提高精度,可以将长度与其他2条边的长度平均。公式请参见此处:http://en.wikipedia.org/wiki/Pythagorean_theorem - Dan Bryant
4
你能否精确定义旋转矩形的“宽度”是什么意思? - Eric Lippert
它与非旋转矩形相同。也就是说,如果您使用四个点构成一个宽度为100的矩形,然后将其旋转,那么宽度不应更改。无论矩形如何旋转,您都应该能够计算出100的值。 - Trevor Elliott
3个回答

7

如果您所说的“宽度”和“高度”只是指边长,并且您已将4个PointF结构存储在列表或数组中,您可以执行以下操作:

double width = Math.Sqrt( Math.Pow(point[1].X - point[0].X, 2) + Math.Pow(point[1].Y - point[0].Y, 2));
double height = Math.Sqrt( Math.Pow(point[2].X - point[1].X, 2) + Math.Pow(point[2].Y - point[1].Y, 2));

5
只需使用计算两点间距离的算法即可。如果有点A、B、C、D,则会得到两个距离。 sqrt((Bx-Ax)^2 + (By-Ay)^2) 等于 sqrt((Dx-Cx)^2 + (Dy-Cy)^2) sqrt((Cx-Bx)^2 + (Cy-By)^2) 等于 sqrt((Ax-Dx)^2 + (Ay-Dy)^2) 选择其中一个作为宽度,另一个作为高度。

1

假设左上角为A,则按逆时针方向命名其他边为ABCD

矩形的宽度= A和B之间的距离
矩形的高度= B和C之间的距离

计算两点之间距离的公式,例如A(x1,y1)和B(x2,y2):

d = sqrt( (x2 - x1)^2 + ( y2 - y1)^2 )

其中 d 代表距离。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接