You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

路径规划开发:如何正确检测线段是否以任意方式穿过多边形?

线段为矩形对角线时无法正确判定与多边形的相交关系

我正在开发一款用于在图像(后续适配视频帧)中查找两点间路径的程序,通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:45:30