我已经研究了几天,但没有取得任何实质性进展。如果您有任何线索,请告诉我。
免责声明:如果您试图将多个多边形放入一个更大的多边形中,那么我认为,这个问题是NP难问题,因此不太可能开发出高效且准确的算法来解决这个问题。多边形可以在平面内连续平移和旋转,这意味着放置位置可能是无限的,这使得问题的解空间也是无限的。如果您只是想找出小多边形是否适合放在大多边形内部,我缺乏有效的答案,但由于您的要求 -“任何线索都会受到赞赏”- 这里有一个。
(图片来源: http://portal.ku.edu.tr/~cbasdogan/Tutorials/imageU21.JPG)
关键点: 如果B的任何一条线与S的任何一条线相交,或者S的所有线都在B的外部,则B不能包含S。
快速失败过滤器: 获取B和S的边界矩形。如果不能将S的边界矩形放置在B的边界矩形内,则无法将多边形S放入多边形B中。这样,如果B无法包含S,则可以更快地失败。下面的图片说明了三种情况。
(图片来自:http://www.cs.berkeley.edu/~ug/slide/pipeline/assignments/as4/figures/boundcull.gif)
预处理:确定构成B的线的方程。将它们存储在HashMap<<Point, Point>, Line>
中,以备后续步骤使用。您可以通过斜率m和截距c来唯一定义该线,而您线的端点将成为HashMap的键(<Point, Point>
)。
算法:
对于通过上述过滤器的每个S:
在最坏的情况下,该算法的复杂度为每个多边形绘制的O(bs)。
†这一步是采用暴力方法来保证算法易于理解。否则,这里可能存在一种关键的优化,可以更快地得出结果。您可以过滤B的行。如果B的行的端点位于S的最左边或最右边,或者位于S上方或下方,则无需考虑B的行与S的交点。这可以节省很多计算。