3. Iterador amb rectangles (2 punts)

Avís

Per a resoldre aquest exercici no es poden fer servir llistes, tuples, diccionaris ni cap altra estructura de dades per a desar els elements d’un iterador.

Dissenya la funció següent, que pots implementar com un generador o bé fent servir les funcions predefinides i els mòduls de Python que treballen amb iteradors, i desa-la al mòdul itrect (fitxer itrect.py):

itrect.interseccions(it)
Paràmetres:

it – iterador sobre una seqüència no buida de rectangles \(R_0, \, R_1, \, R_2, \, R_3, \, \dots\) (instàncies de la classe Rectangle)

Retorna:

iterador sobre una seqüència S d’enters \(A_1, \, A_2, \, \dots\), on cada valor \(A_i\) és l’àrea de la intersecció dels rectangles \(R_{i-1}\) i \(R_i\), sempre que aquesta intersecció no sigui buida (és a dir, la seqüència S només ha d’incloure valors estrictament positius).

Per exemple,


>>> from itrect import interseccions
>>> from rectangles import Rectangle

>>> r0 = Rectangle(10, 20, 130, 140, 'roig')
>>> r1 = Rectangle(0, 10, 170, 80, 'blau')
>>> r2 = Rectangle(0, 25, 120, 180, 'taronja')
>>> r3 = Rectangle(40, 40, 200, 200, 'verd')
>>> r4 = Rectangle(50, 80, 100, 70, 'lila')

>>> it = iter([r0, r1, r2, r3, r4])
>>> for x in interseccions(it):  
...    print(x)  # Només intersecten r0 amb r1, r1 amb r2 i r2 amb r3
7200
6600
11200

>>> next(it, 'FINAL')
'FINAL'

Suggeriment

Fixeu-vos bé en l’especificació de la classe Rectangle, ja que disposa de mètodes i operacions que us ajudaran a implementar aquesta funció.

Disposeu d’un joc de proves al fitxer tests-itrect.txt.