EDI+VA · Esercizio di Programmazione

EP01_01 — 📏 Tre metriche di distanza nella PDA (Processamento Digitale delle Immagini)

1.17.1 EP01_01 📏 Tre metriche di distanza nella PDA (Processamento Digitale delle Immagini)

In questa attività, devi scrivere un programma che calcoli le tre distanze classiche nella PDA: Euclidea (L2), City-Block (L1) e Chessboard (L∞).

  • Leggi 4 numeri reali che rappresentano le coordinate: \(A_x, A_y, B_x, B_y\).
  • Calcola le tre distanze utilizzando le formule:

\[d_{\text{Euclidea}} = \sqrt{(B_x - A_x)^2 + (B_y - A_y)^2}\]

\[d_{\text{City-block}} = |B_x - A_x| + |B_y - A_y|\]

\[d_{\text{Chessboard}} = \max\big(|B_x - A_x|,\; |B_y - A_y|\big)\]

  • Stampa i tre risultati, ciascuno su una riga, formattati con due cifre decimali, nell’ordine: Euclidea, City-block, Chessboard.

📌 Importante:

  • Utilizza le funzioni matematiche standard del tuo linguaggio: math.sqrt, abs (o fabs) e max.
  • L’output deve contenere solo i numeri (uno per riga), senza testi aggiuntivi.
  • Consulta un simulatore interattivo per questo esercizio nella Figura 1.11 (grafico con trascinamento dei punti e visualizzazione delle tre metriche).

1.17.1.1 🖼️ Perché è importante? – Costo computazionale

In un’immagine 1000×1000 pixel (1 milione di pixel), calcolare la distanza di ogni pixel da un punto di riferimento richiede 1 milione di operazioni. La scelta della metrica influisce sulle prestazioni:

Metrica Operazioni per pixel Costo relativo (1M pixel) Quando utilizzarla
Euclidea (L2) 2 sottrazioni, 2 moltiplicazioni, 1 somma, 1 sqrt 🔴 Più costosa – sqrt è dispendiosa Distanza “reale” nello spazio continuo
City-block (L1) 2 sottrazioni, 2 abs, 1 somma 🟡 Moderata – senza radice quadrata Griglie, robotica, immagini binarie
Chessboard (L∞) 2 sottrazioni, 2 abs, 1 max 🟢 Più efficiente Movimenti di pezzi, morfologia

La funzione sqrt è computazionalmente più costosa rispetto ad operazioni come addizione, sottrazione, moltiplicazione e valore assoluto. Nelle CPU moderne, la differenza può essere piccola (circa 1,5× a 3×), ma nei sistemi embedded o nei cicli di milioni di iterazioni, qualsiasi guadagno conta. Per questo motivo, quando l’obiettivo è solo confrontare le distanze (es.: trovare il punto più vicino), utilizza la distanza euclidea al quadrato.

1.17.1.2 📋 Compito (specifica per VPL)

Input:
Un’unica riga con quattro numeri reali: Ax Ay Bx By

Output:
Tre righe, ciascuna con un numero reale con due cifre decimali (Euclidea, City-block, Chessboard).

1.17.1.3 📌 Esempi

Input Output Osservazione
0
0
3
4
5.00
7.00
4.00
Triangolo 3-4-5
0
0
1
1
1.41
2.00
1.00
Diagonale unitaria

Esempio di test di sqrt in Python, con timeit che isola ogni operazione:

import math
import timeit

N = 50_000_000

def apenas_soma():
    a, b = 3.0, 4.0
    return a + b

def soma_e_sqrt():
    a, b = 3.0, 4.0
    return math.sqrt(a*a + b*b)

t_soma = timeit.timeit(apenas_soma, number=N)
t_sqrt = timeit.timeit(soma_e_sqrt, number=N)

print(f"Somma semplice       : {t_soma:.3f} s")
print(f"Somma + sqrt        : {t_sqrt:.3f} s")
print(f"Rapporto (sqrt/somma)  : {t_sqrt/t_soma:.2f}x")
Somma semplice       : 2.727 s
Somma + sqrt        : 5.113 s
Rapporto (sqrt/somma)  : 1.88x
🎮 Simulatore EP01_01: Metriche di Distanza nello Spazio Discreto Euclidea vs City-block vs Scacchiera

Clicca e trascina i punti A o B nel piano cartesiano o regola le loro coordinate qui sotto per confrontare le tre metriche di distanza in tempo reale.

📐 EUCLIDEA (L2)
5.00
√(Δx² + Δy²)
🧱 CITY-BLOCK (L1)
7.00
|Δx| + |Δy|
🏁 SCACCHIERA (L∞)
4.00
max(|Δx|, |Δy|)
👆 Trascina i punti A (Viola) o B (Arancione) sulla griglia.
Punto A
Punto B
Legenda Geometrica: Linea tratteggiata (Euclidea), Percorso ortogonale a L (City-block) ed Evidenziazione della dimensione massima (Scacchiera).
Euclidea City-block Scacchiera (Max)
Figura 1.11: Simulatore EP01_01: Distanze Euclidea, City-block e Chessboard