通过添加对角线分解简单多边形

时间:2015-04-02 09:15:46

标签: algorithm geometry polygon computational-geometry

我面临的问题是通过在初始多边形中添加对角线(不相交自身),将简单多边形(即没有孔的多边形)有效地分解为较小的简单多边形。 换句话说,这里是我想要有效实现的函数的Java签名(线性时间或n * log(n)):

public static List<SimplePolygon> addDiagonals(SimplePolygon polygon, List<Edge> diagonals);

其中,多边形是由双连接边列表表示的初始多边形,而对角线是边列表,其中边简单地由起始节点和结束节点组成。该函数必须返回通过在多边形中添加对角线而得到的子多边形列表。这是一张显示我想要的图片:

enter image description here

起始多边形位于左上角,另外5个是通过添加对角线产生的子多边形。 我很难找到如何有效地实现这种分解,因为很容易复制入射到对角线的节点,但是如果很多对角线从同一个节点出来,我总是要检查一个节点附近的顶点是否已经重复并且如果是这种情况,那么我将对角线添加到副本中(假设原始属于另一个子多边形),那么我必须再次检查这个重复的节点是否也没有被复制(如果已经有一个对角线相邻)到这个节点)等。 您对如何有效地进行分解了解吗?对不起,如果解释不够清楚。 谢谢!

1 个答案:

答案 0 :(得分:0)

如果对角线已编入索引,则可以使用向量助手,该向量助手计算为每个对角线生成的sp(子多边形)的数量。每个对角线必须生成2个多边形...

  1. 启动此助手(每个对角线的sp数),大小=对角线数,并用零填充。
  2. 选择下一个对角线:如果sp == 2,则移动到下一个对角线。如果不是:
  3. 增加sp的数量(在辅助矢量中),并生成第一个多边形,它以相关的对角线开始并访问相邻的边和对角线,直到它再次到达第一个对角线,如果在此过程中sp生成器访问另一条对角线,也增加了该对角线产生的sp数量。
  4. 如果第一个对角线的sp数= = 1,则再次运行第3步。
  5. 如果仍有未使用的对角线,请返回步骤2.
  6. 这样您就可以保证只生成一次子多边形,没有重复。 最好的。