Domanda

Sto cercando di scrivere un algoritmo che ruota un quadrato attorno al suo centro in 2D fino a che non corrisponde o è "abbastanza vicino" al quadrato ruotato iniziato nella stessa posizione, è la stessa dimensione e ha lo stesso centro. Il che è abbastanza facile.

Tuttavia gli angoli della piazza per necessità corrispondono, in tal modo di ottenere una corrispondenza nell'angolo in alto a destra della piazza per ruotare deve essere abbastanza vicino a quello che originariamente era nell'angolo in alto a destra della piazza ruotato.

Sto cercando di rendere questo il più efficiente possibile, quindi, se la vicinanza delle due piazze in base ai criteri di cui sopra peggiora so che ho bisogno di provare a tornare ruotare nella direzione opposta.

Ho già scritto i metodi per ruotare le piazze, e prova quanto sono vicini gli uni agli altri

Il mio problema principale è come devo cambiare la quantità di ruotare su ogni iterazione in base a quanto mi get

es. Se la misura di corrente è più vicino rispetto al precedente, dimezzare l'angolo e andare nella stessa direzione altrimenti doppio dell'angolo e ruotare in direzione opposta?

Comunque non credo che questa è una soluzione piuttosto scarsa in termini di efficienza.

Tutte le idee sarebbe molto apprezzato.

È stato utile?

Soluzione

Che ne dite di questo schema:

Ruota a 0, 90, 180, 270 angolo (nota che ci sono algoritmo efficiente per queste rotazioni speciali rispetto alla generica rotazione); confrontare ciascuno di loro di trovare il quadrante è necessario essere alla ricerca di. In altre parole, cercare di trovare i due assi con il più alto partita.

Poi fare una ricerca binaria, per esempio quando si è determinato che il quadrato ruotato è nel 90-180 quadranti, quindi partizionare l'area di ricerca in due ottanti: 90-135 e 135-180. Ruota da 90 + 45/2 e 180-45 / 2 e confrontare. Se la rotazione di 90 + 45/2 hanno partita Valore superiore al 180-45 / 2, poi continuare la ricerca nel 90-135 ottante, altrimenti continuare la ricerca nel 135-180 ottante. Lather, risciacquo, di ripetizione.

Ogni volta che nella ricorsione, si esegue questa operazione:

  1. partizionare lo spazio di ricerca in due orthants (se lo spazio di ricerca è da A a B, allora la prima orthant è A + (A + B) / 2 e il secondo è orthant B - (A + B) / 2)
  2. controllare l'orthant sinistra: Ruota di A + (A + B) / 4. Confronta.
  3. controllare l'orthant destra: Ruota di B - (A + B) / 4. Confronta.
  4. Regolare lo spazio di ricerca, sia per orthant sinistra oa destra orthant base al fatto che quella a sinistra oa destra è avere un valore più alto partita.

Altri suggerimenti

Un altro schema mi viene in mente è, invece di cercare di ruotare e di ricerca, si tenta di individuare gli "angoli" della immagine ruotata.

Se l'immagine non contiene lucidi, poi ci sono quattro punti situati a sqrt(width^2+height^2) di distanza dal centro, il cui colore sono esattamente gli stessi dei angoli dell'immagine ruotata. Ciò limiterà il numero di giri è necessario effettuare la ricerca.

... anche, per costruire sugli altri suggerimenti qui, ricordate che per ogni rettangolo di ruotare attorno al suo centro, è sufficiente calcolare la rotazione del un solo angolo . È possibile dedurre gli altri tre angoli aggiungendo o sottraendo lo stesso offset che si è calcolato per ottenere il primo calcio d'angolo. Questo dovrebbe accelerare i calcoli un po '(supponendo [ma non pensando] che questo è un collo di bottiglia qui).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top