58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
# 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
|