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

技术问题:如何将红色多边形投影到绿色矩形上?

多边形投影到矩形及非重叠区域计算方案

一、将红色多边形投影到绿色矩形

这里默认采用轴对齐约束投影(把多边形顶点限制在矩形范围内,超出部分贴合矩形边界),步骤如下:

  1. 确定绿色矩形的边界范围:设左、下、右、上边界分别为 x_min、y_min、x_max、y_max
  2. 对红色多边形的每个顶点 (x, y) 做投影计算:
    • 投影x坐标:若 x < x_min 取 x_min,x > x_max 取 x_max,否则保留原x
    • 投影y坐标:若 y < y_min 取 y_min,y > y_max 取 y_max,否则保留原y
  3. 将所有投影后的顶点按原多边形顺序连接,即可得到投影后的多边形(可合并重合顶点简化形状)

示例代码(Python):

# 定义绿色矩形边界:(x_min, y_min, x_max, y_max)
green_rect = (10, 10, 100, 100)

def project_vertex(x, y, rect):
    x_min, y_min, x_max, y_max = rect
    proj_x = max(x_min, min(x, x_max))
    proj_y = max(y_min, min(y, y_max))
    return (proj_x, proj_y)

# 红色多边形顶点列表:[(x1,y1), (x2,y2), ...]
red_polygon = [(5, 15), (120, 20), (90, 110), (20, 80)]
# 生成投影后的多边形
projected_polygon = [project_vertex(x, y, green_rect) for x, y in red_polygon]

二、计算二者的非重叠区域

非重叠区域分为两部分:红色多边形超出矩形的部分、矩形未被多边形覆盖的部分。核心是先求二者交集,再通过差集运算得到结果:

1. 求红色多边形与绿色矩形的交集

使用经典Sutherland-Hodgman多边形裁剪算法,通过矩形四条边依次裁剪红色多边形,最终得到交集区域:

  • 算法逻辑:对每条裁剪边(左、右、下、上),遍历多边形顶点对,判断顶点在边的内侧/外侧,保留内侧顶点;若顶点对跨裁剪边,则计算交点并加入结果
  • 关键函数:判断顶点是否在裁剪边内侧、计算线段与裁剪边的交点

示例代码思路:

def is_inside(vertex, edge):
    # edge格式:(edge_type, value),如('left', x_min),判断顶点是否在边内侧
    x, y = vertex
    edge_type, val = edge
    if edge_type == 'left':
        return x >= val
    elif edge_type == 'right':
        return x <= val
    elif edge_type == 'bottom':
        return y >= val
    elif edge_type == 'top':
        return y <= val

def compute_intersection(s, e, edge):
    # 计算线段s-e与裁剪边的交点
    sx, sy = s
    ex, ey = e
    edge_type, val = edge
    if edge_type in ['left', 'right']:
        t = (val - sx) / (ex - sx) if ex != sx else 0
        y = sy + t * (ey - sy)
        return (val, y)
    else:
        t = (val - sy) / (ey - sy) if ey != sy else 0
        x = sx + t * (ex - sx)
        return (x, val)

def sutherland_hodgman(polygon, clip_edges):
    output = polygon.copy()
    for edge in clip_edges:
        input_list = output
        output = []
        if not input_list:
            break
        start = input_list[-1]
        for end in input_list:
            if is_inside(end, edge):
                if not is_inside(start, edge):
                    output.append(compute_intersection(start, end, edge))
                output.append(end)
            elif is_inside(start, edge):
                output.append(compute_intersection(start, end, edge))
            start = end
    return output

# 定义矩形的四条裁剪边
clip_edges = [('left', green_rect[0]), ('right', green_rect[2]), 
              ('bottom', green_rect[1]), ('top', green_rect[3])]
# 计算交集多边形
intersection_polygon = sutherland_hodgman(red_polygon, clip_edges)

2. 计算非重叠区域

  • 红色多边形非重叠部分:原红色多边形 减去 交集多边形(多边形差集运算)
  • 绿色矩形非重叠部分:原绿色矩形 减去 交集多边形
  • 若只需面积,可分别计算原图形面积与交集面积的差值(多边形面积用 shoelace 公式计算即可)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:24:27