2011-09-19 83 views
4

我具有形成矩形的四个点的高度,并且我允许用户移动的任何点和旋转的角度的矩形(其旋转的每个点绕中心点) 。它保持接近完美的矩形形状(只要PointF精度允许)。下面是从四点画出我的“矩形”的一个例子:计算宽度和从4点的多边形

enter image description here

不过,我需要能够得到点之间的宽度和高度。这是很容易当矩形不旋转,但一旦我转动它我的数学返回由红色轮廓此处显示的宽度和高度:

enter image description here

假设我知道点的顺序(从顶部顺时针例如左),我如何检索它们代表的矩形的宽度和高度?

+0

这真的是越来越几何问题。你可以取前三个点并计算边的长度。如果您想要稍微提高精度,则可以使用其他2个边长度来平均长度。对于公式,请参见:http://en.wikipedia.org/wiki/Pythagorean_theorem –

+4

您能准确地定义您的旋转矩形的“宽度”是什么意思吗? –

+0

它与非旋转矩形相同。如上所述,如果您采用宽度为100的四个点的矩形,然后旋转它,则宽度不应改变。无论矩形的旋转如何,您都应该能够计算出100的值。 –

回答

6

如果“宽度”和“高度”,你刚才的意思是边长,你有你的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)); 
+0

谢谢,这个作品很棒。 –

+0

-1为没有教学的答案。 – Shibumi

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 B和C之间的矩形之间的

宽度=距离和B
高度矩形=距离

式找到两个点之间的距离表示A(x1,y1)和B(x2,y2)是:

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

其中d是距离。