我遇到了以下问题:我在整数网格上给出了一组坐标,用于定义多边形的顶点。保证多边形是凸的。事实证明,这样的多边形总是可以通过2条正交线切割成4个相等的面积部分。让我们称这些线的交点为P
。
给定该集合,我应该计算多边形内P
的坐标和线需要打开的角度,以便线将多边形切割成4个相等的部分。
我意识到,总的来说,蛋糕切割问题没有“好”的解决方案。但这个特殊情况应该如此。 我已经搜索了一个算法来解决这个问题,但没有发现任何有用的东西。 我应该在哪里看?
我的方法是计算多边形中心的坐标(可以或多或少地完成),将P
放在那里,然后“摆动”直到部分区域匹配。但这听起来太不优雅了。
UPD:that's the problem I'm dealing with。也许这个问题应该暂停,直到我提出实际的代码问题。
答案 0 :(得分:1)
以下是解决方案的部分草图:
选择一个任意方向,找到与该方向平行的线,将多边形分成两部分。要实现此目的,请按每个顶点绘制一条线以分解平板中的多边形。板坯的相应区域将告诉您所需的线与什么板相交。简单的线性插值将给出线的确切位置。
现在,您的多边形被分成两个凸多边形。对于每一半,使用垂直方向重复上述过程。一般来说,你会得到两个不同的分离器,还有待完成的是找到它们确实重合的方向。
在给定方向上,分割器与多边形的四个特定边相交。如果稍微旋转,它们仍然会相同的四条边相交。您可以分解角度范围内的整圈,使四条相交的边缘保持不变。
了解四个相交的边,您可以建立关系,告诉您两个垂直分割器之间的距离作为角度的函数。然后,您可以计算两个分割器重合的角度,并检查此角度是否属于为这些边缘定义的范围。
通过依次尝试所有范围,您将找到解决方案。
注意:角度范围的限制对应于与连接两个顶点的线平行或垂直的方向。