Ordina i rettangoli in una griglia in base a un confronto del punto centrale di ciascuno

1

Se ho una griglia di rettangoli e sposto uno dei rettangoli, diciamo sopra e alla sinistra di un altro rettangolo, come potrei ricorrere ai rettangoli?

Nota che i rettangoli sono in una matrice, quindi ogni rettangolo ha un indice e un tag corrispondente. Tutto quello che devo veramente fare è impostare l'indice corretto in base alla nuova posizione del punto centrale del rettangolo all'interno del rettangolo, rispetto alla posizione del punto centrale degli altri rettangoli nella griglia. Ecco cosa sto facendo ora in pseudo codice (funziona in qualche modo, ma non è accurato):

-(void)sortViews:myView {
int newIndex;
// myView is the view that was moved.
[viewsArray removeObject:myView];
[viewsArray enumerate:obj*view]{
    if (myView.center.x > view.center.x) {
        if (myView.center.y > view.center.y) {
            newIndex = view.tag -1;
            *stop = YES;
        } else {
            newIndex = view.tag +1;
            *stop = YES;
        }
    } else if (myView.center.x < view.center.x) {
        if (myView.center.y > view.center.y) {
            newIndex = view.tag -1;
            *stop = YES;
        } else {
            newIndex = view.tag +1;
            *stop = YES;
        }
    }
}];
if (newIndex < 0) {
    newIndex = 0;
} else if (newIndex > 5) {
    newIndex = 5;
}
[viewsArray insertObject:myView atIndex:newIndex];
[self arrangeGrid];
}
    
posta Mrwolfy 17.09.2013 - 07:33
fonte

1 risposta

1

Non è davvero una risposta, ma non si adatta a un commento:

In primo luogo, quello che stai facendo sembra a mio parere. Non ho familiarità con la lingua, ma gli array di solito sono molto veloci.

Se hai un gran numero di rettangoli, un dizionario o una mappa, usare i tasti x / y sarebbe più elegante. Quindi puoi trovare la tua voce più velocemente, rimuoverla senza spostare migliaia di elementi nella matrice e inserire senza spostare gli elementi. (Mi piacerebbe che sarebbero molto più veloci con elenchi di grandi dimensioni, ma sono stato imbarazzato da matrici assurdamente veloci troppe volte in benchmark.) (Assicurati di rimuovere prima il rettangolo, quindi cambia la chiave, quindi aggiungila di nuovo.)

Se ti attacchi con un array, puoi velocizzare le cose con le ricerche binarie per trovare il rettangolo e capire dove metterlo. Puoi anche velocizzare le cose spostando solo gli elementi tra il punto di rimozione e il punto di inserimento.

La tua lingua sembra fare molto lavoro per te: potresti voler controllare cosa sta facendo e cosa altro può fare per te. (Il tuo "array" potrebbe già essere un dizionario / mappa - o qualcosa di meglio. Potresti essere in grado di farlo spostare un elemento in una volta sola, piuttosto che rimuovere e aggiungere, risparmiando così lo spostamento di molte voci.)

    
risposta data 17.09.2013 - 18:40
fonte

Leggi altre domande sui tag