.. py:module:: quadrat Classe Quadrat ============== #. En el fitxer :file:`quadrat.py`, dissenyeu la classe :py:class:`Quadrat` que permet de representar quadrats. .. py:class:: Quadrat(v, m) Retorna un nou quadrat tal que el vèrtex de coordenades x i y mínimes és *v* (:py:class:`~punt2D.Punt2D`) i la longitud de l'aresta és *m*. **Atributs**: .. py:attribute:: vèrtex Vèrtex de coordenades x i y mínimes del quadrat. És de classe :py:class:`~punt2D.Punt2D` [#p2d]_. .. py:attribute:: mida Longitud de l'aresta del quadrat. **Mètodes**: .. py:method:: té_dins(p) Retorna True si el punt p és dins del quadrat i False en cas contrari. També suporta la funció :class:`str`. Per exemple: .. literalinclude:: quadrat.txt :language: python3 :end-before: ---- Observeu que cal implementar, a més del mètode :meth:`~quadrat.Quadrat.té_dins`, els mètodes ``__init__`` i ``__str__``. El mètode ``__init__`` assigna el valor *v* a l'atribut :attr:`~quadrat.Quadrat.vèrtex` i el valor *m* a l'atribut :attr:`~quadrat.Quadrat.mida`. El mètode ``__str__`` retorna un string en format 'Quadrat(Punt2D(x, y), mida)'. Disposeu d'aquest joc de proves al fitxer :download:`quadrat.txt `. #. En el shell de python, creeu una instància de la classe :py:class:`~quadrat.Quadrat`. Consulteu i modifiqueu els seus atributs. Feu-ne un print. Creeu una instància de la classe :py:class:`~punt2D.Punt2D` i comproveu si és dins del quadrat. Proveu de fer el següent experiment: .. code:: python >>> 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: .. code:: python >>> 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 :py:meth:`~quadrat.Quadrat.copy` que retorna una còpia del quadrat. Cal que utilitzeu la funció: :py:func:`~copy.deepcopy` del mòdul :py:mod:`copy`. Disposeu d'aquest joc de proves al fitxer :download:`quadrat.txt `. .. rubric:: Solució Disposeu d'una solució al fitxer :download:`quadrat.py `. .. py:module:: selec_quadrats Funció selec_quadrats ====================== #. En el fitxer :file:`selec_quadrats.py`, dissenyeu la funció :func:`selec_quadrats` especificada com: .. function:: selec_quadrats(itq, area, punt) :param itq: un iterador sobre una sequència de quadrats (:py:class:`quadrat.Quadrat`) :param area: el valor d'una àrea (:py:class:`float`) :param punt: una instància a la classe :py:class:`punt2D.Punt2D` :return: 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: .. literalinclude:: test-selec_quadrats.txt :language: python :lines: 6-20 .. warning:: En el disseny de la funció :func:`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 :py:class:`~quadrat.Quadrat` i :py:class:`~punt2D.Punt2D`: fitxers :download:`quadrat.py ` i :download:`punt2D.py`. Disposeu de més tests al fitxer :download:`test-selec_quadrats.txt ` i d'una solució :download:`selec_quadrats.py ` .. py:module:: quadratdibuix Classe QuadratDibuix ==================== #. En el fitxer :file:`quadratdibuix.py`, dissenyeu la classe :py:class:`~quadratdibuix.QuadratDibuix` que es deriva, per herència, de la classe :py:class:`~quadrat.Quadrat`. .. py:class:: QuadratDibuix(vrt, md, col, p) Retorna un nou QuadratDibuix tal que el vèrtex de coordenades x i y mínimes és *vrt* (:py:class:`~punt2D.Punt2D`), la longitud de l'aresta és *md*, el color *col* i *p* (:class:`bool`) indica si el quadrat s'ha d'omplir de color. **Atributs**: .. py:attribute:: color Tuple (R, G, B) que codifica el color del quadrat. .. py:attribute:: ple Booleà que indica si el quadrat s'ha d'omplir de color. **Mètodes**: .. py:method:: color_vàlid() Retorna ``True`` si cadascun dels tres components estan compresos entre 0 i 255 i ``False`` altrament. #. En el shell de python, creeu una instància de la classe :py:class:`~quadratdibuix.QuadratDibuix`. Consulteu i modifiqueu els seus atributs. Comproveu que el mètode :meth:`~quadrat.Quadrat.té_dins` de la classe pare :py:class:`~quadrat.Quadrat` s'ha heretat i per tant també hi és aplicable. Comproveu el mètode :meth:`~quadratdibuix.QuadratDibuix.color_vàlid`. Creeu una instància a la classe :py:class:`~quadrat.Quadrat` i comproveu què passa si intenteu cridar el mètode :meth:`~quadratdibuix.QuadratDibuix.color_vàlid`. Disposeu d'aquest joc de proves al fitxer :download:`quadratdibuix.txt `. .. rubric:: Solució Disposeu d'una solució al fitxer :download:`quadratdibuix.py `. .. [#p2d] Si no teniu el mòdul :py:mod:`punt2D`, podeu descarregar-lo: :download:`punt2D.py <../Classe_Punt2D/solucio/punt2D.py>`.