我面临的问题是通过在初始多边形中添加对角线(不相交自身),将简单多边形(即没有孔的多边形)有效地分解为较小的简单多边形。 换句话说,这里是我想要有效实现的函数的Java签名(线性时间或n * log(n)):
public static List<SimplePolygon> addDiagonals(SimplePolygon polygon, List<Edge> diagonals);
其中,多边形是由双连接边列表表示的初始多边形,而对角线是边列表,其中边简单地由起始节点和结束节点组成。该函数必须返回通过在多边形中添加对角线而得到的子多边形列表。这是一张显示我想要的图片:
起始多边形位于左上角,另外5个是通过添加对角线产生的子多边形。 我很难找到如何有效地实现这种分解,因为很容易复制入射到对角线的节点,但是如果很多对角线从同一个节点出来,我总是要检查一个节点附近的顶点是否已经重复并且如果是这种情况,那么我将对角线添加到副本中(假设原始属于另一个子多边形),那么我必须再次检查这个重复的节点是否也没有被复制(如果已经有一个对角线相邻)到这个节点)等。 您对如何有效地进行分解了解吗?对不起,如果解释不够清楚。 谢谢!
答案 0 :(得分:0)
如果对角线已编入索引,则可以使用向量助手,该向量助手计算为每个对角线生成的sp(子多边形)的数量。每个对角线必须生成2个多边形...
这样您就可以保证只生成一次子多边形,没有重复。 最好的。