路径规划开发:如何正确检测线段是否以任意方式穿过多边形?
线段为矩形对角线时无法正确判定与多边形的相交关系
我正在开发一款用于在图像(后续适配视频帧)中查找两点间路径的程序,通过Polygon对象识别路径上的障碍物并规划绕行路线,核心代码如下:
SimplePoint = tuple[int, int] def getPolygonsInWay(start: SimplePoint, end: SimplePoint, polygons: list[Polygon]) -> list[Polygon]: line = LineString([start, end]) polygonsInWay = [polygon for polygon in polygons if line.crosses(polygon)] # make sure line.crosses() doesnt return true if the starting point is on the polygon return polygonsInWay def getPaths(start: SimplePoint, end: SimplePoint, polygons: list[Polygon], prev_points: list[SimplePoint] = []) -> list[list[SimplePoint]]: polygonsInWay = getPolygonsInWay(start, end, polygons) if not polygonsInWay: return [[start, end]] closestPolygon = closestPolygonToPoint(start, polygons) xyValsOld = closestPolygon.exterior.xy xyVals = [] for i in range(len(xyValsOld[0])): xyVals.append((xyValsOld[0][i], xyValsOld[1][i])) xyVals = list(set(xyVals)) # remove duplicates polXVals = [val[0] for val in xyVals] polYVals = [val[1] for val in xyVals] okPoints = [] for i in range(len(polXVals)): if start == (polXVals[i], polYVals[i]): continue if int(polXVals[i]) != polXVals[i] or int(polYVals[i]) != polYVals[i]: continue if (int(polXVals[i]), int(polYVals[i])) in prev_points: continue if closestPolygon not in getPolygonsInWay(start, (polXVals[i], polYVals[i]), polygons): #and closestPolygon not in getPolygonsInWay((polXVals[i], polYVals[i]), end, polygons): okPoints.append((int(polXVals[i]), int(polYVals[i]))) paths = [[start] for _ in range(len(okPoints))] for i in range(len(okPoints)): point = (okPoints[i][0], okPoints[i][1]) paths[i].extend(getShortestPath(getPaths(point, end, polygons, prev_points + [point]), point, end)) return paths
目前仅使用矩形、正方形、圆形等简单形状作为障碍物,待功能稳定后切换为视频帧输入。当前遇到的问题是:当线段恰好为矩形的对角线时,getPolygonsInWay函数列表推导式中的line.crosses(polygon)会返回false,无法正确判定线段与多边形的相交关系。
补充示例:
polygon = Polygon([[411, 182], [411, 335], [210, 335], [210, 182]]) start = (440, 35) end = (90, 600)
运行getShortestPath(getPaths(start, end, polygons, []))后得到路径:[(440, 35), (411, 182), (210, 335), (90, 600)],未正确识别矩形障碍物并绕行。
内容的提问来源于stack exchange,提问作者highjeans
相关产品推荐
相关产品推荐

