.. py:module:: punt2D Classe Punt2D ============= Disseny de la classe -------------------- #. Dissenyeu la classe :py:class:`Punt2D` que permet de representar punts de l'espai 2D i deseu-la al fitxer :file:`punt2D.py`. L'especificació de la classe :py:class:`Punt2D` és la següent: .. py:class:: Punt2D (x=0, y=0) Atributs: .. py:attribute:: x Coordenada x del punt (enter) .. py:attribute:: y Coordenada y del punt (enter) Mètodes: .. py:method:: dist(p) Retorna la distància entre la instància i el punt p. La classe suporta a més la funció :class:`str` que retorna un string de format 'Punt2D(coordx, coordy)'. Vegeu els exemples: >>> from punt2D import Punt2D >>> t = Punt2D(1, 34) >>> str(t) 'Punt2D(1, 34)' >>> print(t) Punt2D(1, 34) >>> t = Punt2D(0, 0) >>> q = Punt2D(1, 1) >>> print('{:2.1f}'.format(t.dist(q))) 1.4 Per implementar aquesta classe, haureu de crear el mètode :py:meth:`Punt2D.__init__()` que inicialitza els atributs del punt, el mètode :py:meth:`Punt2D.dist()` i també el mètode :py:meth:`Punt2D.__str__()` per tal donar suport a la funció :class:`str`. #. En un shell de python, creeu una instància de la classe :py:class:`Punt2D`. Consulteu i modifiqueu els seus atributs. Feu-ne un print. Vegeu com s'ha invocat el mètode :py:meth:`Punt2D.__str__()`. Creeu una segona instància a la classe :py:class:`Punt2D` i comproveu el valor de la seva distància a la primera instància. Comproveu que el valor de :py:obj:`p.dist(q)` és el mateix que :py:obj:`q.dist(p)`. .. note:: Disposeu de jocs de proves al fitxer :download:`punt2D_1.txt` Utilització de la classe ------------------------ #. En el mòdul ``punts_pla.py`` dissenyeu la funció :py:func:`llista_punts2D()` que a partir d'una llista de tuples, on cada tupla representa un punt amb les seves coordenades (x, y), retorna la llista d'instàncies a la classe :py:class:`Punt2D`. #. Un polígon es representa com una llista de punts ordenats topològicament de tal forma que entre dos punts consecutius d'una llista hi ha una aresta i que la darrera aresta és la que uneix el darrer punt amb el primer. En el mòdul ``punts_pla.py`` dissenyeu la funció :py:func:`perímetre_polígon()` que donada una llista d'instàncies a la classe :py:class:`Punt2D` retorna el perímetre del polígon corresponent. .. note:: Disposeu de jocs de proves al fitxer :download:`punts_pla.txt `. Sobrecàrrega i còpia -------------------- #. En el shell de python, proveu de fer el següent experiment: .. code:: python >>> p = Punt2D(6, 7) >>> q = p >>> p.x = 4 Quin és el valor de q? Afegiu a la classe :py:class:`Punt2D` el mètode :py:meth:`copia` que retorna una còpia del punt (no un àlies) utilitzant la funció :py:func:`~copy.copy` del mòdul :py:mod:`copy`. #. Afegiu a la classe :py:class:`Punt2D` el mètode ``__eq__(self, p)`` que retorna ``True`` si les dues coordenades dels dos punts tenen el mateix valor i retorna ``False`` altrament. Per exemple: .. code:: python >>> p = Punt2D(1, 1) >>> q = p >>> p == q True >>> q = Punt2D(1, 1) >>> p == q True >>> q = Punt2D(2, 1) >>> p == q False .. note:: Disposeu de jocs de proves al fitxer :download:`punt2D_2.txt` Herència --------- #. En el mòdul ``punt2D_plus`` dissenyeu la classe :py:class:`Punt2D_plus` que es deriva de la classe :py:class:`Punt2D` però li afegeix dos atributs, el diàmetre de la circumferència amb la que es representa gràficament el punt i el seu color. .. py:class:: Punt2D_plus(x, y, color, diàmetre) Té els atributs de la classe base i, a més: .. py:attribute:: col Color del punt (una tupla (r, g, b)) .. py:attribute:: diam Diàmetre de la circumferència que representa gràficament el punt (float) Proveu de crear una instància a la classe :py:class:`Punt2D_plus`. Intenteu utilitzar el mètode :py:meth:`dist` amb aquesta instància. Ho podeu fer? Per què? .. note:: Disposeu de jocs de proves al fitxer :download:`punt2D_plus.txt ` .. note:: Disposeu de solucions als fitxers :download:`punt2D.py `, :download:`punts_pla.py ` i :download:`punt2D_plus.py `