Classe Quadrat

  1. En el fitxer quadrat.py, dissenyeu la classe Quadrat que permet de representar quadrats.

    class quadrat.Quadrat(v, m)

    Retorna un nou quadrat tal que el vèrtex de coordenades x i y mínimes és v (Punt2D) i la longitud de l’aresta és m.

    Atributs:

    vèrtex

    Vèrtex de coordenades x i y mínimes del quadrat. És de classe Punt2D [1].

    mida

    Longitud de l’aresta del quadrat.

    Mètodes:

    té_dins(p)

    Retorna True si el punt p és dins del quadrat i False en cas contrari.

    També suporta la funció str.

    Per exemple:

    >>> from punt2D import Punt2D
    >>> from quadrat import Quadrat
    
    >>> p = Punt2D(3, 4)
    >>> q = Quadrat(p, 5)
    >>> str(q)
    'Quadrat(Punt2D(3, 4), 5)'
    
    >>> p1 = Punt2D(0, 0)
    >>> q = Quadrat(p1, 10)
    >>> p2 = Punt2D(5, 5)
    >>> q.té_dins(p2)
    True
    >>> p3 = Punt2D(-1, -1)
    >>> q.té_dins(p3)
    False
    
    

    Observeu que cal implementar, a més del mètode té_dins(), els mètodes __init__ i __str__. El mètode __init__ assigna el valor v a l’atribut vèrtex i el valor m a l’atribut mida. El mètode __str__ retorna un string en format “Quadrat(Punt2D(x, y), mida)”.

    Disposeu d’aquest joc de proves al fitxer quadrat.txt.

  2. En el shell de python, creeu una instància de la classe Quadrat. Consulteu i modifiqueu els seus atributs. Feu-ne un print. Creeu una instància de la classe Punt2D i comproveu si és dins del quadrat. Proveu de fer el següent experiment:

    >>> from punt2D import Punt2D
    >>> from quadrat import Quadrat
    
    >>> q1 = Quadrat(Punt2D(0, 0), 1)
    >>> q2 = q1
    >>> q1.mida = 4
    

    Quin és el valor de q2? Proveu ara:

    >>> q1 = Quadrat(Punt2D(1, 1), 2)
    >>> q2 = Quadrat(Punt2D(0, 0), 1)
    >>> q2.mida = q1.mida
    >>> q2.vèrtex = q1.vèrtex
    >>> q1.mida = 7
    >>> q1.vèrtex.x = 66
    

    Quin és el valor de q2? Per què? Implementeu el mètode copy() que retorna una còpia del quadrat. Cal que utilitzeu la funció: deepcopy() del mòdul copy.

Disposeu d’aquest joc de proves al fitxer quadrat.txt.

Solució

Disposeu d’una solució al fitxer quadrat.py.

Funció selec_quadrats

  1. En el fitxer selec_quadrats.py, dissenyeu la funció selec_quadrats() especificada com:

selec_quadrats.selec_quadrats(itq, area, punt)
Paràmetres:
Retorna:

un iterador sobre una seqüència d’strings corresponents als vèrtexs inferior esquerra d’aquells quadrats que tenen una àrea més gran que la donada i que contenen el punt donat, convertits a string.

Exemple:

>>> lq = [(-4, 8, 10), (9, 2, 10), (1, 4, 2), (5, -2, 16), (-27, -5, 2), (-6, 4, 9), (1, 6, 20), (-3, 4, 18), (3, 4, 8), (6, 1, 12), (67, 12, 3)]
>>> itq = map(lambda x: Quadrat(Punt2D(x[0], x[1]), x[2]), lq)
>>> it1, it2, it3 = itertools.tee(itq, 3)
>>> it1 = selec_quadrats(it1, 25, Punt2D(14, 7))
>>> iter(it1) == it1
True
>>> list(it1)
['Punt2D(9, 2)', 'Punt2D(5, -2)', 'Punt2D(1, 6)', 'Punt2D(-3, 4)', 'Punt2D(6, 1)']
>>> it2 = selec_quadrats(it2, 100, Punt2D(14, 12))
>>> list(it2)
['Punt2D(5, -2)', 'Punt2D(1, 6)', 'Punt2D(-3, 4)', 'Punt2D(6, 1)']

>>> it3 = selec_quadrats(it3, 25, Punt2D(20, 20))
>>> list(it3)
['Punt2D(1, 6)']

Avís

En el disseny de la funció selec_quadrats() no es poden fer servir llistes, tuples, diccionaris ni cap altra estructura de dades per a desar els elements d’un iterador.

Per a resoldre aquest exercici cal que us descarregueu els fitxers amb les implementacions de les classes Quadrat i Punt2D: fitxers quadrat.py i punt2D.py.

Disposeu de més tests al fitxer test-selec_quadrats.txt i d’una solució selec_quadrats.py

Classe QuadratDibuix

  1. En el fitxer quadratdibuix.py, dissenyeu la classe QuadratDibuix que es deriva, per herència, de la classe Quadrat.

    class quadratdibuix.QuadratDibuix(vrt, md, col, p)

    Retorna un nou QuadratDibuix tal que el vèrtex de coordenades x i y mínimes és vrt (Punt2D), la longitud de l’aresta és md, el color col i p (bool) indica si el quadrat s’ha d’omplir de color.

    Atributs:

    color

    Tupla (R, G, B) que codifica el color del quadrat.

    ple

    Booleà que indica si el quadrat s’ha d’omplir de color.

    Mètodes:

    color_vàlid()

    Retorna True si cadascun dels tres components estan compresos entre 0 i 255 i False altrament.

  2. En el shell de python, creeu una instància de la classe QuadratDibuix. Consulteu i modifiqueu els seus atributs. Comproveu que el mètode té_dins() de la classe pare Quadrat s’ha heretat i per tant també hi és aplicable. Comproveu el mètode color_vàlid(). Creeu una instància a la classe Quadrat i comproveu què passa si intenteu cridar el mètode color_vàlid().

    Disposeu d’aquest joc de proves al fitxer quadratdibuix.txt.

Solució

Disposeu d’una solució al fitxer quadratdibuix.py.