用于验证非交叉形状的自由多边形顶点的算法

时间:2014-10-03 15:34:15

标签: algorithm validation geometry

我的任务是允许用户在画布上输入任意数量的任意点,并按照指定的顺序将它们链接在一起以绘制多边形。

但是,每次用户尝试添加一个点时,我必须验证是否仍然可以绘制多边形而不相交。

我搜索了SO,发现只有this post对我没有帮助。

每次在画布上添加新点时,我都需要形成约束,并检查下一个点是否验证了这些约束。

我添加了一些关于我在下面尝试实现的目标的糟糕插图。使用以下方法定义坐标系可能会有所帮助:点1是原点(0,0)x是正面的,y是正面的顶部。

添加第3点

前两个点只有1 != 2,添加点3的约束我必须确保它不会位于通过1的线上的任何位置}和2

adding point 3

添加第4点

现在,添加了点3后,点4被屏蔽了,如下图所示:

Adding point 4

黄色区域受到行1-2的约束,绿色区域受到行2-3的约束。 在非常难以理解的标记中(没有MathJax或其他任何内容)我认为4的约束是:

Y_4 < ( (Y_2 - Y_1) / (X_2 - X_1) )*X_4 + Y_1

Y_3 < ( (Y_2 - Y_1) / (X_2 - X_1) )*X_3 ? Y_4 > ( (Y_3 - Y_2) / (X_3 - X_2) )*X_4 + Y_2 : Y_4 < ( (Y_3 - Y_2) / (X_3 - X_2) )*X_4 + Y_2  

Y_4 =/= ( (Y_3 - Y_1) / (X_3 - X_1) )*X_4 + Y_1

添加第5点

现在在第5点添加约束区域为:

Adding point 4

它开始变得复杂。

我想知道是否有针对这类事情的既定算法,或者是否存在顶点n方面的一般方程来生成约束方程。可能有几十个,甚至几百个点,所以通过蛮力和手工编码找出并不是一个选择。

2 个答案:

答案 0 :(得分:3)

你可以这样做:

  1. 添加新点。
  2. 在此点附近添加两条新边。
  3. 通过迭代所有边对并检查它们是否相交来检查是否存在一对相交边。
  4. 每增加一个新点,此算法的时间复杂度为O(n^2)。如果太慢,可以使用以下观察使其成为线性:
    如果在添加新点之前多边形有效,则没有边可以相交。这就是为什么不需要迭代所有边缘对的原因。因此,您只能对<new, any>对进行迭代,其中new是新创建的边,any是多边形的任意边。有2 * n = O(n)个这样的对(因为添加一个点只产生2个新边)。

    此算法每点的时间复杂度为O(n),因此它应足够快,可达数十或数百个点。

    检查两条边是否相交很简单:边是一条线,检查两条线是否相交是一个众所周知的问题。

答案 1 :(得分:1)

您想要实现的目标称为多边形简单性测试。您将在本文中找到相关信息:&#34;平面多边形的定向,简单和包含测试&#34;,F。FEITO,J。C. TORRES和A. URENA。