如何找出两个多边形两边交汇形成的线段?
我需要一个函数,给定两个或更多的多边形,可以把边分割成边与边的交点,就像图中那样,我该怎么做呢?
举个例子,有两条边相交: [(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()
左边是输入的图像,右边是输出的图像: