Área de intersección en Python

Tengo un código que toma una condición C como entrada y calcula la solución a mi problema como un 'área permitida' A en el espacio (x, y). Esta área está compuesta de varios 'tubos', que están definidos por 2 líneas que nunca pueden cruzarse.

El resultado final que estoy buscando debe satisfacer k condiciones {C1, .., Ck}, y por lo tanto es una intersección S entre k áreas {A1, .., Ak}.

Aquí hay un ejemplo con 2 condiciones (A1: verde, 3 tubos. A2: púrpura, 1 tubo); la solución S está en rojo.

¿Cómo puedo encontrar S cuando estoy trabajando con 4 áreas de alrededor de 10 tubos cada una? (¡La trama final es horrible!)

Necesitaría poder trazarlo y encontrar la coordenada media y la varianza de los puntos en S (varianza de cada coordenada). [Si hay una manera eficiente de saber si un punto P pertenece a S o no, simplemente usaré un método de Monte Carlo].

Idealmente, también me gustaría poder implementar "tubos prohibidos" que quitaría de S [podría ser un poco más complicado que intersecar S con el exterior de mi área prohibida, ya que dos tubos de la misma área pueden cruzarse (incluso si las líneas que definen un tubo nunca se cruzan)].

Nota:

El código también almacena la longitud del arco de las líneas.

Las líneas se almacenan como conjuntos de puntos (alrededor de 1000 puntos por línea). Las dos líneas que definen un tubo no tienen necesariamente el mismo número de puntos, pero Python puede interpolar TODOS en función de la longitud de su arco en 1 segundo.

Las líneas son funciones paramétricas (es decir, no podemos escribir y = f (x), ya que se permite que las líneas sean verticales).

La trama se editó con pintura para obtener el resultado a la derecha ... ¡No muy eficiente!

Editar:

No sé cómo puedo usar plt.fill_between para una intersección múltiple (puedo hacerlo aquí por 2 condiciones, pero necesito el código para hacerlo automáticamente cuando hay demasiadas líneas para juzgar).

Por ahora solo genero las líneas. No escribí nada para encontrar la solución final, ya que no sé qué estructura es la más adecuada para esto. [Sin embargo, una versión anterior del código fue capaz de encontrar los puntos de intersección entre las líneas de 2 tubos diferentes, y estaba planeando pasarlos como polígonos para darles forma, pero esto implicaba varios otros problemas ...]

No creo que pueda hacerlo consets: escanear todo el área (x, y) con la precisión requerida representa alrededor de 6e8 puntos ... [Las líneas tienen solo 1e3 puntos gracias a un tamaño de paso variable (se adapta a la curvatura), pero todo el problema es bastante grande]

Respuestas a la pregunta(1)

Su respuesta a la pregunta