# -*- coding:utf-8 -*-

__projet__ = "CoursS6"
__nom_fichier__ = "classePoint"
__author__ = "A-J. Tinet"
__date__ = "décembre 2022"

# =====================================================================================================================

#                                           Ex 3 - Formes Géométriques
#                                                   Classe POINT

# =====================================================================================================================

# Définition de la classe
class Point:

    def __init__(self, abscisse = 0, ordonnee = 0):
        """
        Méthode constructeur de la classe Point.
        :param abscisse: nombre décimal
        :param ordonnee: nombre décimal
        """
        self.x_ = abscisse
        self.y_ = ordonnee

    def __str__(self):
        """
        Surcharge de print() et de str()
        :return: Chaîne de caractère
        """
        return str(self.x_) + ' , ' + str(self.y_)

    def getx(self):
        """
        Méthode accesseur.
        :return: Abscisse
        """
        return self.x_

    def gety(self):
        """
        Méthode accesseur.
        :return: Ordonnée
        """
        return self.y_

    def setx(self, x):
        """
        Méthode mutateur
        :param x: nombre entier, nouvelle valeur de x
        :return:
        """
        self.x_ = x

    def sety(self, y):
        """
        Méthode mutateur
        :param y: nombre entier, nouvelle valeur de y
        :return:
        """
        self.y_ = y

    def distance(self):
        """
        :return: Distance du point à l'origine (0, 0)
        """
        return (self.x_**2 + self.y_**2)**0.5

    def deplacer(self, dx = 0, dy = 0):
        """
        Déplace le point.
        :param dx: Déplacement selon les abscisses
        :param dy: Déplacement selon les ordonnées
        :return: None
        """
        self.x_ += dx
        self.y_ += dy

    def longueur(self, other):
        """
        :param other: objet Point
        :return: Longueur entre deux points
        """
        return ((self.x_ - other.getx())**2 + (self.y_ - other.gety())**2)**0.5


# Programme principal
if __name__ == '__main__':

    # Validation des fonctions
    ptO = Point() # Valeurs par défaut
    print(ptO)    # Surcharge de print

    ptA = Point(0, 1)
    print(ptA.distance()) # 1

    print(ptA.getx(), ptA.gety()) # 0 1

    ptO.deplace(1,3)
    print(ptO)  # 1 , 3

    # Calcul du périmètre du triangle ABC
    ptB = Point(7, 3)
    ptC = Point(2, 3)

    print(ptA.longueur(ptB) + ptB.longueur(ptC) + ptC.longueur(ptA))