Algorithm 验证非相交形状的自由多边形顶点的算法

Algorithm 验证非相交形状的自由多边形顶点的算法,algorithm,validation,geometry,Algorithm,Validation,Geometry,我的任务是允许用户在画布上输入任意数量的点,并按照指定的顺序将它们链接在一起以绘制多边形 但是,每次用户尝试添加点时,我必须验证多边形是否仍然可以在不与自身相交的情况下绘制 我找了这么多,只找到了对我没有帮助的 每次将新点添加到画布时,我都需要形成约束,并检查下一个点是否未验证这些约束 我在下面添加了一些拙劣的插图,说明我正在努力实现的目标。它可能有助于定义我正在使用的坐标系:点1是原点(0,0),x在右侧为正值,y在顶部为正值 添加第3点 前两点只有1!=2,添加点3我必须确保它不会位于通过1

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

但是,每次用户尝试添加点时,我必须验证多边形是否仍然可以在不与自身相交的情况下绘制

我找了这么多,只找到了对我没有帮助的

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

我在下面添加了一些拙劣的插图,说明我正在努力实现的目标。它可能有助于定义我正在使用的坐标系:点
1
是原点
(0,0)
x
在右侧为正值,
y
在顶部为正值

添加第3点

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

添加第4点

现在,添加了点
3
,点
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
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点上添加约束区域:

事情开始变得复杂起来


我想知道对于这类事情是否有任何已建立的算法,或者是否有关于顶点
n
的一般方程来生成约束方程。如果不是几百点,也可能有几十点,所以用暴力和手工编码似乎不是一个选择

你可以这样做:

  • 添加一个新点
  • 添加与该点相邻的两条新边
  • 通过迭代所有对边并检查它们是否相交,检查是否存在一对相交边
  • 该算法每增加一个新点,时间复杂度
    O(n^2)
    。如果速度太慢,可以使用以下观察值使其线性化:
    如果多边形在添加新点之前有效,则任何边都不能相交。这就是为什么不需要迭代所有对边的原因。因此,您只能在对上迭代
    ,其中
    new
    是新创建的边,
    any
    是多边形的任何边。有
    2*n=O(n)
    这样的对(因为添加一个点只产生两条新边)

    该算法每点的时间复杂度为
    O(n)
    ,因此对于数十或数百个点来说应该足够快


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

    您可以这样做:

  • 添加一个新点
  • 添加与该点相邻的两条新边
  • 通过迭代所有对边并检查它们是否相交,检查是否存在一对相交边
  • 该算法每增加一个新点,时间复杂度
    O(n^2)
    。如果速度太慢,可以使用以下观察值使其线性化:
    如果多边形在添加新点之前有效,则任何边都不能相交。这就是为什么不需要迭代所有对边的原因。因此,您只能在对上迭代
    ,其中
    new
    是新创建的边,
    any
    是多边形的任何边。有
    2*n=O(n)
    这样的对(因为添加一个点只产生两条新边)

    该算法每点的时间复杂度为
    O(n)
    ,因此对于数十或数百个点来说应该足够快


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

    您想要实现的是所谓的多边形简单性测试。您将在本文中找到相关信息:“平面多边形的方向、简单性和包含测试”,F.FEITO、J.C.TORRES和A.URENA。

    您想要实现的是所谓的多边形简单性测试。您将在这篇文章中找到相关信息:“平面多边形的方向、简单性和包含测试”,F.FEITO,J.C.TORRES和A.URENA。

    谢谢,这是一个非常好的算法,他们还引用了Balbes和Siegel的一篇论文:“计算平面多边形的简单性和方向的一种稳健方法”这是值得一看的。谢谢你的反馈。稳健性确实是一个重要的话题,因为在实践中,你遇到退化或准退化的情况比想象的要多。谢谢,这是一个非常好的算法,他们还引用了Balbes和Siegel的一篇论文:“计算平面多边形的简单性和方向的稳健性方法”这是值得一看的。谢谢你的反馈。稳健性确实是一个重要的主题,因为在实践中,您遇到退化或准退化情况的频率比预期的要高。