# LAB-41: Classe Point (Punto) # Obiettivo: rappresentare un punto nel piano cartesiano e calcolare distanze. # Concetti chiave: attributi privati, metodi getter, math.hypot. import math # Importiamo il modulo math per usare hypot() class Point: def __init__(self, x=0.0, y=0.0): # I parametri hanno valori di default (0.0), quindi si può creare # un punto nell'origine semplicemente scrivendo Point(). # Il doppio underscore __ rende gli attributi privati (name mangling). self.__x = float(x) # convertiamo a float per sicurezza self.__y = float(y) def getx(self): # Getter: restituisce la coordinata x. # Necessario perché __x è privato e non accessibile dall'esterno. return self.__x def gety(self): # Getter: restituisce la coordinata y. return self.__y def distance_from_xy(self, x, y): # Calcola la distanza tra questo punto e le coordinate (x, y) fornite. # math.hypot(a, b) calcola √(a² + b²), che è esattamente la formula # della distanza euclidea: d = √((x2-x1)² + (y2-y1)²) return math.hypot(self.__x - x, self.__y - y) def distance_from_point(self, point): # Calcola la distanza tra questo punto e un altro oggetto Point. # Usiamo i getter dell'altro oggetto per accedere alle sue coordinate private. return self.distance_from_xy(point.getx(), point.gety()) # --- TEST --- point1 = Point(0, 0) # origine point2 = Point(1, 1) # punto a distanza √2 dall'origine # Distanza da point1 a point2: √((1-0)² + (1-0)²) = √2 ≈ 1.4142... print(point1.distance_from_point(point2)) # → 1.4142135623730951 # Distanza da point2 (1,1) a (2,0): √((2-1)² + (0-1)²) = √2 ≈ 1.4142... print(point2.distance_from_xy(2, 0)) # → 1.4142135623730951