In questa attività, devi implementare la rotazione di un’immagine attorno al suo centro geometrico. Questa operazione richiede il mapping delle coordinate e l’uso di tecniche di interpolazione per determinare i nuovi valori dei pixel.
Leggi due interi L e C, che rappresentano le dimensioni della matrice.
Leggi un valore reale \(\theta\) (angolo in gradi) e una stringa che rappresenta il metodo di interpolazione (nearest o bilinear).
Leggi i valori interi della matrice originale.
Esegui la rotazione attorno al centro dell’immagine \((L/2, C/2)\).
Stampa la matrice risultante con le stesse dimensioni dell’originale.
Mapping Inverso: Per evitare “buchi” nell’immagine finale, percorri ogni pixel \((x', y')\) dell’immagine di destinazione e calcola la sua posizione corrispondente \((x, y)\) nell’immagine originale usando la matrice di rotazione inversa.
Interpolazione:
nearest: Assegna il valore del pixel più vicino alla coordinata calcolata.
bilinear: Calcola una media ponderata basata sui 4 vicini più prossimi.
Bordi: I pixel la cui origine \((x, y)\) cade fuori dai limiti dell’immagine originale devono essere riempiti con 0.
2.12.6.1 🧠 Trasformazione per Angolo
La rotazione di un punto \((x, y)\) rispetto all’origine di un angolo \(\theta\) è data dalla matrice di trasformazione. Per ruotare attorno a un centro \((x_c, y_c)\), prima trasliamo il centro nell’origine, ruotiamo e trasliamo di nuovo:
Suggerimento: Usa il mapping inverso per garantire che tutti i pixel dell’immagine di uscita siano riempiti correttamente.
2.12.6.2 📋 Compito (specifica per VPL)
Input:
La prima riga contiene L.
La seconda riga contiene C.
La terza riga contiene l’angolo theta (in gradi) e il metodo interp (nearest o bilinear).
Le righe successive contengono gli elementi della matrice \(L \times C\).
Output:
La matrice ruotata con L righe e C colonne.
2.12.6.3 📌 Esempi
Input
Output
Osservazione
2
2
90 nearest
1 2
3 4
3 1
4 2
Rotazione di 90° in senso orario: la colonna 0 diventa la riga 0 (dal basso verso l’alto). \((0,0)=1→(1,0)\), \((1,0)=3→(0,0)\), \((0,1)=2→(1,1)\), \((1,1)=4→(0,1)\).
3
3
45 bilinear
0 0 0
0 255 0
0 0 0
0 180 0
180 255 180
0 180 0
Rotazione di 45°: il pixel centrale rimane \(255\); i vicini diretti ricevono un valore interpolato \(\approx 180\) tramite bilineare; gli angoli rimangono \(0\).
Regola l'angolo di rotazione (θ) tramite slider o scorciatoie rapide per osservare la trasformazione trigonometrica delle coordinate attorno al centro dell'immagine.
0°
● Quadrato verde con marcatore arancione (angolo in alto a destra) – rotazione attorno al centro.
θ = 0° → cos = 1.000, sin = 0.000 → Matrice Identità
Figura 2.17: Simulatore EP02_06: Rotazione dell’immagine attorno all’origine di un angolo θ
%%writefile EP02_06.cpp// your solution
Overwriting EP02_06.cpp
TestSuite("EP02_06.cpp").run()
✔️ EP02_06.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP02_06.cases
🔍 Test di C++: EP02_06.cpp
⚠️ EP02_06.cpp: file vuoto (meno di 3 righe). Test saltati.