# LAB-42: Classe Triangle (Triangolo) # Obiettivo: usare la composizione — incorporare oggetti Point all'interno di Triangle. # La composizione ("ha un") è alternativa all'ereditarietà ("è un"): # un Triangolo NON è un Punto, ma HA (contiene) tre Punti. import math class Point: """Rappresenta un punto nel piano cartesiano con coordinate private.""" def __init__(self, x=0.0, y=0.0): self.__x = float(x) self.__y = float(y) def getx(self): return self.__x def gety(self): return self.__y def distance_from_xy(self, x, y): # Distanza euclidea verso le coordinate (x, y) return math.hypot(self.__x - x, self.__y - y) def distance_from_point(self, point): # Distanza verso un altro oggetto Point return self.distance_from_xy(point.getx(), point.gety()) class Triangle: """Rappresenta un triangolo definito da tre vertici (oggetti Point).""" def __init__(self, vertice1, vertice2, vertice3): # I tre vertici vengono memorizzati in una lista privata. # Usare una lista facilita l'iterazione, ad esempio nel calcolo del perimetro. self.__vertici = [vertice1, vertice2, vertice3] def perimeter(self): # Il perimetro è la somma delle lunghezze dei tre lati. # Lato 1: dal vertice 0 al vertice 1 # Lato 2: dal vertice 1 al vertice 2 # Lato 3: dal vertice 2 al vertice 0 (chiude il triangolo) v = self.__vertici # alias locale per leggibilità lato1 = v[0].distance_from_point(v[1]) lato2 = v[1].distance_from_point(v[2]) lato3 = v[2].distance_from_point(v[0]) return lato1 + lato2 + lato3 # --- TEST --- # Triangolo rettangolo isoscele con cateti di lunghezza 1: # vertice A = (0,0), B = (1,0), C = (0,1) # Lati: AB = 1, AC = 1, BC = √2 ≈ 1.4142 # Perimetro = 1 + 1 + √2 ≈ 3.4142... triangle = Triangle(Point(0, 0), Point(1, 0), Point(0, 1)) print(triangle.perimeter()) # → 3.414213562373095