Come calcolare la rotazione delle figure in modo efficiente?


13

Immagine 1 Immagine 2

Ho una figura rappresentata attraverso una matrice di byte (matrice bitmap-like). Esempio La figura è mostrata sul Picture 1.

L'obiettivo è trovare il miglior angolo di rotazione di una determinata figura . Quando la figura viene ruotata secondo l'angolo migliore, il rettangolo che è parallelo agli assi X e Y e indica la figura ha l'area più piccola.

I rettangoli che segnano la figura sono mostrati in grigio chiaro sulle immagini. Nel Picture 2, puoi vedere che la rotazione ideale della Figura è di circa 30 gradi in senso orario.

Ora conosco l'algoritmo come trovare questo angolo, ma mi sembra molto inefficiente. Va così:

  1. Passa attraverso gli angoli da 0 a 45.
  2. Per l'angolo corrente, per ogni punto della figura calcolare la posizione nuova, ruotata
  3. Trova i limiti del rettangolo che contiene figure (minimo e massimo x, y) e registralo se è la migliore corrispondenza finora
  4. Angolo successivo

Questo è un tipo di metodo della forza bruta e funziona bene e ragionevolmente veloce per le piccole figure. Tuttavia, devo lavorare con cifre che contengono fino a 10 milioni di punti e il mio algoritmo diventa lento.

Quale sarebbe un buon algoritmo per questo problema?

Risposte:


20

Sembra che sia possibile trovare il riquadro di delimitazione minimo allineato arbitrariamente usando l' algoritmo dei calibri rotanti a tempo lineare .

Una volta che hai il riquadro di delimitazione, devi solo determinare l'angolo di rotazione calcolando la pendenza di uno dei lati.


Questa è un'ottima soluzione, ottima.
Informato l'

Bene, dal momento che ho già ordinato i punti per xey, posso trovare lo scafo convesso con questo en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/… e usare l'algoritmo esistente con i punti dello scafo.
Dusan,

12

Il primo passo del tuo approccio è imperfetto: ci sono un numero infinito di valori reali tra 0 e 45, quindi non ha senso "scorrerli". Tuttavia, il tuo algoritmo può essere riparato:

  • trova lo scafo convesso del poligono

  • passare attraverso il numero finito (!) di angoli dato dai bordi esterni dello scafo convesso

  • ora applica i passaggi da 2 a 4 usando questi angoli.

Questo funziona perché si può dimostrare che il rettangolo di chiusura minimo deve toccare uno dei bordi esterni dello scafo convesso.


Sì, è esattamente quello che sto per fare, ho già trovato un aiuto con la risposta del Dan. Grazie.
Dusan,

@Dusan: non sono sicuro che l'altra risposta descriva lo stesso approccio, quindi ho cercato di descrivere la soluzione in un modo più semplice, speriamo un po 'più chiaro. Ho trovato una descrizione qui: cgm.cs.mcgill.ca/~orm/maer.html
Doc Brown,

Sì, hai ragione, il tuo approccio è molto più concreto, più semplice e più chiaro, ma ho concluso io stesso lo stesso approccio con i suggerimenti forniti nella risposta di Dan, quindi gli ho dato un'accettazione. Spero che la tua risposta ottenga molti più voti positivi. Senza rancore. Saluti!
Dusan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.