Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何有效地检测和删除形状中的非连接线_Algorithm_Polygon_Point In Polygon - Fatal编程技术网

Algorithm 如何有效地检测和删除形状中的非连接线

Algorithm 如何有效地检测和删除形状中的非连接线,algorithm,polygon,point-in-polygon,Algorithm,Polygon,Point In Polygon,我希望执行多边形中的点检查,但首先需要删除多边形中的冗余线,以便执行光线投射算法。多边形以二维二进制数组表示(1表示填充,0表示空)。冗余线被视为在两端有一个点,该点没有至少两个相邻单元填充(即北、东、南和/或西,但不是对角填充) 具有连接点的线示例(白色=空,蓝色=填充): 以断开点结尾的线条示例(白色=空,蓝色=填充,绿色=填充但断开): 多边形示例(白色=空,蓝色=填充,绿色=删除): 删除冗余点后的多边形示例(白色=空,蓝色=填充): 一个简单但效率极低的算法是检测相邻填充点

我希望执行多边形中的点检查,但首先需要删除多边形中的冗余线,以便执行光线投射算法。多边形以二维二进制数组表示(1表示填充,0表示空)。冗余线被视为在两端有一个点,该点没有至少两个相邻单元填充(即北、东、南和/或西,但不是对角填充)

具有连接点的线示例(白色=空,蓝色=填充):

以断开点结尾的线条示例(白色=空,蓝色=填充,绿色=填充但断开):

多边形示例(白色=空,蓝色=填充,绿色=删除):

删除冗余点后的多边形示例(白色=空,蓝色=填充):

一个简单但效率极低的算法是检测相邻填充点少于2个的点,然后移除这些点并循环,直到没有进行任何更改。有什么更有效的方法可以做到这一点


旁注:我知道2x2(或更大)面积的填充点将被视为相互连接,因此不会被删除-这是有意的。我还意识到,光线投射测试需要考虑水平线和垂直线,以便在我到达光线投射算法时使用。

A应该可以很好地解决这个问题。@user3386109如中所述,执行泛光填充并使用填充区域检测多边形内的点,而不是删除多余的线并使用射线追踪?没有。如中所示,扫描阵列直到在多边形上找到一个点。然后使用整体填充来跟随多边形周围的点。当到达死角(只有一个相邻单元)时,移除该单元。然后沿着死胡同向后走,边走边删除单元格。A应该可以很好地解决这个问题。@user3386109如中所述,执行泛光填充并使用填充区域检测多边形内部的点,而不是删除多余的线并使用光线跟踪?否。如中所示,扫描阵列直到在多边形上找到一个点。然后使用整体填充来跟随多边形周围的点。当到达死角(只有一个相邻单元)时,移除该单元。然后沿着死胡同向后走,边走边删除单元格。