Come calcolare la rotazione delle figure in modo efficiente?

13

Ho una Figura rappresentata attraverso una matrice di byte (matrice bitmap). Esempio Figura è mostrato in Picture 1 .

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

I rettangoli che indicano la figura sono mostrati in grigio chiaro sulle immagini. In 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 che sia molto inefficiente. Funziona così:

  1. Passa attraverso gli angoli da 0 a 45.
  2. Per l'angolo corrente, per ogni punto della figura calcola la nuova posizione ruotata
  3. Trova i limiti del rettangolo che contiene la figura (minima e massima x, y) e registrala se è la migliore corrispondenza fino ad ora
  4. Angolo successivo

Questo è un tipo di metodo a forza bruta e funziona bene e abbastanza velocemente per le piccole figure. Tuttavia, ho bisogno di lavorare con figure che contengano fino a 10 milioni di punti, e il mio algoritmo diventa lento.

Quale sarebbe un buon algoritmo per questo problema?

    
posta Dusan 11.11.2014 - 22:20
fonte

2 risposte

20

Sembra che tu possa trovare la casella di delimitazione minima allineata arbitrariamente utilizzando il tempo lineare Algoritmo dei calibri rotanti .

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

    
risposta data 11.11.2014 - 22:37
fonte
12

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

  • trova scafo convesso del poligono

  • attraversa il numero finito (!) di angoli dati dai bordi esterni dello scafo convesso

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

Funziona perché può essere mostrato che il rettangolo che racchiude il minimo deve toccare uno dei bordi esterni dello scafo convesso.

    
risposta data 11.11.2014 - 22:49
fonte

Leggi altre domande sui tag