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:

%%writefile tmp/mm_out_1.cpp
// Benchmark: soma simples vs soma + sqrt
#include <chrono>
#include <cmath>
#include <iostream>

int main() {
    const long long N = 50000000;  // 50 milhões

    // Mide o tempo apenas da soma
    auto t0 = std::chrono::high_resolution_clock::now();
    for (long long i = 0; i < N; ++i) {
        double a = 3.0, b = 4.0;
        volatile double resultado = a + b;  // evita otimização
    }
    auto t1 = std::chrono::high_resolution_clock::now();
    double t_soma = std::chrono::duration<double>(t1 - t0).count();

    // Mide o tempo da soma + sqrt
    t0 = std::chrono::high_resolution_clock::now();
    for (long long i = 0; i < N; ++i) {
        double a = 3.0, b = 4.0;
        volatile double resultado = std::sqrt(a*a + b*b);  // evita otimização
    }
    t1 = std::chrono::high_resolution_clock::now();
    double t_sqrt = std::chrono::duration<double>(t1 - t0).count();

    std::cout << "Soma simples       : " << t_soma << " s\n";
    std::cout << "Soma + sqrt        : " << t_sqrt << " s\n";
    std::cout << "Razão (sqrt/soma)  : " << (t_sqrt/t_soma) << "x\n";

    return 0;
}
Overwriting tmp/mm_out_1.cpp
!g++ -I. -std=c++17 tmp/mm_out_1.cpp -o tmp/mm_out_1 \
  && ./tmp/mm_out_1
Soma simples       : 0.113353 s
Soma + sqrt        : 0.156901 s
Razão (sqrt/soma)  : 1.38418x
🎮 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