我的任务是允许用户在画布上输入任意数量的任意点,并按照指定的顺序将它们链接在一起以绘制多边形。
但是,每次用户尝试添加一个点时,我必须验证是否仍然可以绘制多边形而不相交。
我搜索了SO,发现只有this post对我没有帮助。
每次在画布上添加新点时,我都需要形成约束,并检查下一个点是否验证了这些约束。
我添加了一些关于我在下面尝试实现的目标的糟糕插图。使用以下方法定义坐标系可能会有所帮助:点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
添加第5点
现在在第5点添加约束区域为:
它开始变得复杂。
我想知道是否有针对这类事情的既定算法,或者是否存在顶点n
方面的一般方程来生成约束方程。可能有几十个,甚至几百个点,所以通过蛮力和手工编码找出并不是一个选择。
答案 0 :(得分:3)
你可以这样做:
每增加一个新点,此算法的时间复杂度为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。