# -*- coding: utf-8 -*-
__projet__ = "Chenille animée"
__nom_fichier__ = "point"
__author__ = "AJ Tinet"
__date__ = "février 2026"


# Import des classes et bibliothèques utiles
from math import sqrt

# =============================================================================

# Définition de la classe Point
class Point:
    """Definit les points de l'espace 2D."""

    def __init__(self, x=0, y=0):
        """
        Constructeur de la classe Point.
        ----------------------------------------------------------------------
        :param x: Abscisse, defaults to 0
        :type x: INT, optional
        :param y: Ordonnée, defaults to 0
        :type y: INT, optional

        """
        self.x_ = x
        self.y_ = y


    def __repr__(self):
        """
        Surcharge de print
        ----------------------------------------------------------------------
        :return: Description du point

        """
        return "coordonnee horizontale = " + str(self.x_)  + " coordonnees verticale = " + str(self.y_)


    def getx(self):
        """
        Accesseur de x
        ----------------------------------------------------------------------          
        :return: Abscisse
        :rtype: INT

        """   
        return self.x_


    def gety(self):
        """
        Accesseur de y
        ----------------------------------------------------------------------          
        :return: Ordonnée
        :rtype: INT

        """ 
        return self.y_


    def setx(self, newx):
        """
        Mutateur de x
        ----------------------------------------------------------------------        
        :param newx: nouvelle valeur de l'abscisse
        :type newx: INT

        """
        self.x_ = newx


    def sety(self, newy):
        """
        Mutateur de y
        ----------------------------------------------------------------------        
        :param newy: nouvelle valeur de l'ordonnée
        :type newy: INT

        """
        self.y_ = newy


    def deplace(self, dx, dy):
        """
        Modifie la position du point en le déplaçant de (dx, dy)
        ---------------------------------------------------------------------- 
        :param dx: Déplacement sur l'axe des x
        :type dx: INT
        :param dy: Déplacement sur l'axe des y
        :type dy: INT

        """
        self.x_ += dx
        self.y_ += dy


    def distance(self):
        """
        Calcul de la distance à l'origine
        ---------------------------------------------------------------------- 
        :return: Distance du point à l'origine
        :rtype: FLOAT

        """
        return sqrt(self.x_**2 + self.y_**2)


    def longueur(self, other):
        """
        Calcul de la distance entre les deux points
        ---------------------------------------------------------------------- 


        :param other: Autre point
        :type other: Instance de POINT
        :return: Distance entre les deux points self et other
        :rtype: FLOAT

        """
        return sqrt((self.x_-other.x_)**2 + (self.y_-other.y_)**2)

# =============================================================================
        
# Programme principal : Test de la classe Point   
if __name__ == "__main__":
    
    O = Point()            # test creation point par défaut
    print(O)

    pt = Point(3, 4)        # test creation point quelconque
    print(pt)
    pt2 = pt.copy()
    print(pt)
    print(pt.getx(), pt.gety())     # test accesseurs
    
    pt.setx(34)     # test mutateurs
    pt.sety(45)
    print(pt)
    
    pt.deplace(10, 100)
    print(pt)
    
    print(pt.distance())
    
    # Application de l'exercice 3
    A = Point(0, 1)
    B = Point(7,3)
    C = Point(2,5)
    # calcul périmètre triangle A - B - C
    print(A.longueur(B) + B.longueur(C) + C.longueur(A))