如何找出两个多边形两边交汇形成的线段?

0 投票
1 回答
45 浏览
提问于 2025-04-12 08:31

我需要一个函数,给定两个或更多的多边形,可以把边分割成边与边的交点,就像图中那样,我该怎么做呢?

举个例子,有两条边相交: [(0.0, 0.0), (0.0, 10.0)] [(0.0, 5.0), (0.0, 7.0)] 结果应该是3段 " [[(0.0, 0.0), (0.0, 5.0)], [(0.0, 5.0), (0.0, 7.0)], [(0.0, 7.0), (0.0, 10.0)]] "

在这里输入图片描述

我试过用两个只有一条边的假多边形来测试,但没有成功。


from shapely.geometry import LineString

def encontrar_segmentos_de_reta(poligono1, poligono2):
    segmentos = []
    for i in range(len(poligono1)):
        p1 = poligono1[i]
        p2 = poligono1[(i + 1) % len(poligono1)]
        for j in range(len(poligono2)):
            q1 = poligono2[j]
            q2 = poligono2[(j + 1) % len(poligono2)]
            if intersecta(p1, p2, q1, q2):
                intersecao = encontrar_intersecao(p1, p2, q1, q2)
                if intersecao:
                    segmentos.append([p1, intersecao])
                    segmentos.append([intersecao, p2])
                    segmentos.append([q1, intersecao])
                    segmentos.append([intersecao, q2])
    return segmentos

def intersecta(p1, p2, q1, q2):
    line1 = LineString([p1, p2])
    line2 = LineString([q1, q2])
    return line1.intersects(line2)

def encontrar_intersecao(p1, p2, q1, q2):
    line1 = LineString([p1, p2])
    line2 = LineString([q1, q2])
    intersection = line1.intersection(line2)
    if intersection.is_empty:
        return None
    elif intersection.geom_type == 'Point':
        return list(intersection.coords)
    elif intersection.geom_type == 'LineString':
        return list(intersection.coords)[0]  # Use o primeiro ponto da linha

def RemoverRepetidos(paredes):
    novo_paredes = []
    for segmento in paredes:
        if segmento[0]!=segmento[1]:
            novo_paredes.append(segmento)

    return novo_paredes


# Definindo os polígonos de entrada
poligono1 = [(0.0, 0.0), (0.0, 10.0)]
poligono2 = [(0.0, 5.0), (0.0, 7.0)]

# Encontrar segmentos de reta formados pela interseção dos lados dos polígonos
segmentos = encontrar_segmentos_de_reta(poligono1, poligono2)
segmentos = RemoverRepetidos(segmentos)
print("Segmentos de reta formados:", segmentos)

1 个回答

1

我不太明白你的代码或者例子,不过我觉得(希望吧?)下面这个代码示例展示了(原理)你可以如何实现你需要的功能:

from matplotlib import pyplot as plt
import matplotlib.colors as mcolors
import shapely
from shapely.plotting import plot_line, plot_polygon

poly1 = shapely.box(2, 0, 4, 3)
poly2 = shapely.box(0, 1, 2, 2)

lines = []
# Intersecting lines
intersecting_lines = poly1.boundary.intersection(poly2.boundary)
lines.extend(shapely.get_parts(shapely.line_merge(intersecting_lines)))

# Non intersecting boundaries
lines.extend(
    shapely.get_parts(shapely.line_merge(poly1.boundary.difference(intersecting_lines)))
)
lines.extend(
    shapely.get_parts(shapely.line_merge(poly2.boundary.difference(intersecting_lines)))
)

# Plot
fig, ax = plt.subplots(ncols=2, figsize=(15, 15))
plot_polygon(poly1, ax=ax[0], color="red")
plot_polygon(poly2, ax=ax[0])

colors = []
for line, color in zip(lines, mcolors.TABLEAU_COLORS):
    plot_line(line, ax=ax[1], color=color)

plt.show()

左边是输入的图像,右边是输出的图像:

在这里输入图像描述

撰写回答