将凸多边形拟合到给定矩形中

时间:2016-06-25 10:05:35

标签: java algorithm geometry convex-polygon

我想采用凸多边形并通过旋转和缩放将其拟合到给定的矩形中。

我的方法是以小步长(如1°)转动多边形并始终测量分数(最大水平距离/最大垂直距离),取最接近分数(矩形宽度/矩形高度)和比例的那个它适合矩形。

我想知道是否存在“不太原始”的方法。此外,可能有一个更好的“最佳拟合”定义,而不仅仅是测量最大水平和垂直距离。我的真正目的是使多边形“看起来很好”,当我将其存储为图像文件或将其打印在页面上时。

1 个答案:

答案 0 :(得分:3)

您可以使用rotating calipers之类的方法。 enter image description here

旋转卡尺算法在找到两对平行线的对映顶点时,需要四条垂直线 - 边界矩形。

选择第一个顶点,找到它的对映顶点 - 它是第一个卡尺对 建立垂直于第一个卡钳对的第二个卡钳对。
将两个卡钳对旋转到一起,直到找到下一个对映对(在第一个卡钳之间或在第二个卡钳之间) - 确定下一个极值角点。
继续旋转卡尺。

边界矩形的宽度和高度在极值点之间会不断变化。宽度/高度比例也会连续。因此,如果你发现在第i个极值点W / H< P和in(i + 1)极值点W / H> P,其中P是需要的比例,那么区间i..i + 1包含所需的P值(Bolzano's theorem)。

当您找到带解的区间(如果存在)时,只需计算此角度间隔(三角方程)的卡尺宽度比例,并获得精确的角度值。三角函数方程看起来像

Sin(A) / Sin(A + Pi/2) = F   
or
Sin(A) / Cos(A) = Tan(A) = F