I need a function that, given two or more polygons, can divide the sides into the intersections of the sides as in the figure, how would I do it?
An example would be the meeting of two sides [(0.0, 0.0), (0.0, 10.0)] [(0.0, 5.0), (0.0, 7.0)] which should result in 3 segments " [[(0.0, 0.0), (0.0, 5.0)], [(0.0, 5.0), (0.0, 7.0)], [(0.0, 7.0), (0.0, 10.0)]] "

I tried with two false polygons with only 1 side for the test, but without success.
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)
I don't quite understand your code or your example, but I think (hope?) the following code sample shows (the principle of) how you can accomplish what you need:
Plotted image with input left, output right: