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的一篇论文:“计算平面多边形的简单性和方向的稳健性方法”这是值得一看的。谢谢你的反馈。稳健性确实是一个重要的主题,因为在实践中,您遇到退化或准退化情况的频率比预期的要高。