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

计算多边形内部点到多边形的正负Y方向最小距离的技术问询

针对Y方向的多边形内点距离计算方案

核心思路

不用迭代验证坐标的笨办法,直接通过几何射线相交计算解决:

  • 正Y方向(向上):从目标点出发画一条垂直向上的射线(X固定,Y无限递增),找到这条射线与多边形所有边的交点,筛选出Y坐标大于目标点的交点,计算这些点与目标点的Y值差,取最小值就是向上的最小距离。
  • 负Y方向(向下):同理,画垂直向下的射线(X固定,Y无限递减),筛选Y坐标小于目标点的交点,计算Y值差的绝对值,取最小值即为向下的最小距离。

基于Shapely的实现代码

from shapely.geometry import Point, LineString, Polygon

def get_y_axis_distances(poly: Polygon, point: Point) -> tuple[float, float]:
    # 先确保点在多边形内部
    assert poly.contains(point), "目标点必须位于多边形内部"
    
    px, py = point.x, point.y
    # 构造足够长的上下射线,超出多边形的边界范围
    poly_max_y = poly.bounds[3] + 1
    ray_up = LineString([(px, py), (px, poly_max_y)])
    poly_min_y = poly.bounds[1] - 1
    ray_down = LineString([(px, py), (px, poly_min_y)])
    
    # 获取射线与多边形边界的交点
    intersections_up = poly.exterior.intersection(ray_up)
    intersections_down = poly.exterior.intersection(ray_down)
    
    # 计算正Y方向最小距离
    min_dist_up = float('inf')
    if not intersections_up.is_empty:
        # 处理单个交点或多个交点的情况
        points_up = intersections_up.geoms if hasattr(intersections_up, 'geoms') else [intersections_up]
        for p in points_up:
            if p.y > py:
                current_dist = p.y - py
                if current_dist < min_dist_up:
                    min_dist_up = current_dist
    
    # 计算负Y方向最小距离
    min_dist_down = float('inf')
    if not intersections_down.is_empty:
        points_down = intersections_down.geoms if hasattr(intersections_down, 'geoms') else [intersections_down]
        for p in points_down:
            if p.y < py:
                current_dist = py - p.y
                if current_dist < min_dist_down:
                    min_dist_down = current_dist
    
    return (min_dist_up, min_dist_down)

# 示例使用
if __name__ == "__main__":
    # 构造一个带凹口的多边形
    poly_coords = [(0,0), (0,4), (4,4), (4,0), (2,2), (0,0)]
    poly = Polygon(poly_coords)
    # 取多边形内部一点
    target_point = Point(1, 1)
    dist_up, dist_down = get_y_axis_distances(poly, target_point)
    print(f"正Y方向最小距离: {dist_up}")
    print(f"负Y方向最小距离: {dist_down}")

关键说明

  • 射线长度设置为超出多边形边界的极值,确保能覆盖所有可能的交点,避免漏判
  • 需过滤同方向的交点(向上只取Y更大的点,向下只取Y更小的点),排除反向的无效交点
  • 若目标点恰好位于多边形的垂直边上,可根据需求添加重合边的过滤逻辑,一般场景下不影响核心计算

内容的提问来源于stack exchange,提问作者user24559516

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:21:08