凹多边形(非凸多边形)的对角线(对角线是连接非相邻顶点的线段)可能完全在多边形内或外(或与多边形的边相交)。如何确定它是否完全在多边形内?(一种不需要点-多边形测试的方法)。
凹多边形(非凸多边形)的对角线(对角线是连接非相邻顶点的线段)可能完全在多边形内或外(或与多边形的边相交)。如何确定它是否完全在多边形内?(一种不需要点-多边形测试的方法)。
我知道这个问题已经在很多年前得到了解答,但我有一个新的方法,它很容易实现。
如先前的答案所建议的那样,您应该首先计算多边形的所有边是否与对角线线段相交。计算相交并确定是否存在交点的代码在此处描述here。
如果所有边(不包括与对角线共享顶点的边)都没有与对角线相交,则您知道对角线要么完全位于多边形内部,要么完全位于多边形外部,这意味着对角线的中点也完全位于内部或者完全位于外部。中点是对角线两个端点的平均值。
我们现在已经将问题转化为计算对角线是否在多边形内部或外部,以及中点是否在多边形内部或外部。处理单个点比处理线更容易。
确定点是否在多边形内部的方法在此处描述here,并可以通过计算从该点开始的水平射线的交点数量来总结,看看这条射线与多少个多边形边相交。如果射线与奇数条边相交,则该点在多边形内部,否则在多边形外部。
这种实现容易实现的原因是,在您迭代所有边以检查是否与对角线相交时,您现在也可以计算对角线中点的射线是否与正在处理的当前边相交。如果您的for循环返回没有对角线和边之间的相交,则可以查看偶数/奇数计数以确定对角线是否在内部或外部。
关于检查线段之间的交点(这可能是您需要执行的第一步),我发现SoftSurfer上的解释很有帮助。您需要检查对角线和多边形任何一条边之间的交点。如果您正在使用MATLAB,您应该能够使用矩阵和向量运算同时有效地检查所有边的交点(我已经处理过射线三角形交点的计算)。
John的回答非常准确:
如果您想确定对角线是否永远不会离开多边形的边界,只需确定它是否与相邻顶点之间的任何线段相交。如果是,则已经离开了多边形。
检查这个的一种有效方法是在数据上运行Bentley-Ottman扫描线算法。它很容易实现,但很难使其数值稳定。如果您的多边形边少于...比如...20条,那么暴力搜索很可能更快。