查找一个Polygon是否在另一个内部

时间:2012-08-23 09:15:55

标签: c# algorithm geometry

我想通过给出每个顶点的点数组来找出一个多边形是否在另一个多边形内。有没有简单的方法呢? 编辑:仅检查内部的最小点是否大于外部的最大点和外部的最小点是否小于内部是不够的。这不是充分的条件。证明: enter image description here

5 个答案:

答案 0 :(得分:1)

一旦你检查了多边形A的最小边界框位于多边形B的边界内,我认为你将不得不检查A的每个边缘是否与B的所有边相交。

我认为这是一种简单的方法,但我怀疑你真的想要一种更有效的聪明方法。

答案 1 :(得分:0)

我使用Java2D特别是Area类做了类似的事情。如果要复制该功能,则可以免费获得该类的代码。一个更简单的选择可能是查看这个库:http://www.cs.man.ac.uk/~toby/alan/software/它应该允许你做你想做的事情或者给你起点。

答案 2 :(得分:0)

  1. polygon1的某个点位于polygon2

    的内部

    你可以在这里使用光线投射

  2. 多边形之间没有边缘交叉

    对于大量边缘空间分区树可能会增加速度,对于少量边缘N * M枚举是可以的

答案 3 :(得分:0)

首先,使用轴对齐的边界框来查看它们是否彼此靠近。 (基本上,在每个周围绘制一个X-Y对齐的框,看看它们是否相交。这比多边形更容易,通常可以节省大量时间。)

如果框相交,您现在应该执行详细的交叉测试。您需要绘制一条垂直于“外部”多边形每一边的直线,并将两者中的所有点投影到直线上。然后,检查内部多边形的结果点是否在从外部多边形投射的点之间。

我知道这个例子一开始很难想象 - 我推荐这个关于碰撞检测的教程给那些对这个领域感兴趣的人:

http://www.wildbunny.co.uk/blog/2011/04/20/collision-detection-for-dummies/

但是,如上所述,您的任务略有不同,因为您要投射到每一侧的垂直线上,并且您需要所有这些都包含该段。如果你想做很多这样的话,我还建议对投影和线性代数的概念略微提出一些建议。

答案 4 :(得分:-1)

您的问题尚未确定 - 仅给出每个顶点的坐标不足以指定多边形。示例:绘制正方形并填充对角线。你的五个顶点是方形角和对角线交点处的点。从这些顶点,可以构造四个不同的多边形:每个多边形都是通过使用原始图形的边缘构建的,同时从正方形中移除一个边缘并限制对角线(我希望这是很清楚)。

编辑:显然还不够清楚。设a1,a2,a3,a4为与正方形的四个点对应的顶点(例如,从左上角顺时针方向),并且a5是与正方形对角线的交点对应的顶点。仅仅为了示例,这里有两个适合上述顶点的多边形: 1.(a1,a2),(a2,a5),(a5,a3),(a3,a4),(a4,a1)。这应该看起来像一个正确的pacman。 2.(a1,a2),(a2,a3),(a3,a4),(a4,a5),(a5,a1)。这应该看起来像一个面向左边的pacman。