19/09/14 14:30
amreo
CIAO
Ho costruito in vb.net un selecter, che si occupa per la selezione, deselezione e la verifica di cordinate selezionate
Ho implementato selecter combinando una griglia(X,Y) e List(point)
Devo creare una funzione che mi restituisce un array(vettori) di punti appartenenti a un rettangolo passato come argomento.
Es ho una griglia di 4x4 di punti selezionati o no
1001
0101
0010
1011
lista di punti selezionati:
[0,0]
[3,0]
[1,1]
[3,1]
[2,2]
[0,3]
[2,3]
[3,3]
(i punti 1 sono quelli selezionati e quelli 0 no)
Il problema è come selezionare i punti all' interno es del rettangolo [1,1] con dimensioni 2,2. Mi deve restituire [1,1] e [2,2].
Devo scegliere il miglior algoritmo (più veloce). 2 possibili algoritmi sono
Questo algoritmo funziona ciclando x e y e verificando ogni punto se è selezionato
Invece questo cicla la lista
entrambi hanno i pro e contro:
PRO per il primo: il massimo tempo è rett.width*rett.height,però se non c'è nessun punto selezionato, la funzione in pratica fa pardere tempo
PRO per il secondo: se la lista è abbastanza corta(< rett.width*rett.height) può essere conveniente, ma se è lunghissima(per esempio 1000 item) può impiegarci un sacco di tempo per la ricerca.
L'idea che mi è appena venuto in mente è quello di verificare la dimensione della lista e l'area del rettangolo, scegliendo il primo algoritmo se l'area è minore, altrimenti l'altro
Ho costruito in vb.net un selecter, che si occupa per la selezione, deselezione e la verifica di cordinate selezionate
Ho implementato selecter combinando una griglia(X,Y) e List(point)
Devo creare una funzione che mi restituisce un array(vettori) di punti appartenenti a un rettangolo passato come argomento.
Es ho una griglia di 4x4 di punti selezionati o no
1001
0101
0010
1011
lista di punti selezionati:
[0,0]
[3,0]
[1,1]
[3,1]
[2,2]
[0,3]
[2,3]
[3,3]
(i punti 1 sono quelli selezionati e quelli 0 no)
Il problema è come selezionare i punti all' interno es del rettangolo [1,1] con dimensioni 2,2. Mi deve restituire [1,1] e [2,2].
Devo scegliere il miglior algoritmo (più veloce). 2 possibili algoritmi sono
FUNZIONE getPuntiSelezionatiInRettangolo(sel, rett) punto[] //Dichiara la lista dei punti punti[] //controlla ogni punto appartenente al rettangolo per x = rett.x a rett.x + rett.width - 1 per y = rett.y a rett.y + rett.height - 1 //verifica se è selezionato se (sel.isSelected(x,y)) allora punti.aggiungi(new punto(x,y)) fine per fine per restituisce punti FINE FUNZIONE
Questo algoritmo funziona ciclando x e y e verificando ogni punto se è selezionato
Invece questo cicla la lista
FUNZIONE getPuntiSelezionatiInRettangolo(sel, rett) punto[] //Dichiara la lista dei punti punti[] //controlla ogni punto selezionato per ogni p in sel.getPuntiSelezionati() //verifica se appartiene al rettangolo se rett.intersecaPunto(p) allora punti.aggiungi(p) fine per restituisci punti FINE FUNZIONE
entrambi hanno i pro e contro:
PRO per il primo: il massimo tempo è rett.width*rett.height,però se non c'è nessun punto selezionato, la funzione in pratica fa pardere tempo
PRO per il secondo: se la lista è abbastanza corta(< rett.width*rett.height) può essere conveniente, ma se è lunghissima(per esempio 1000 item) può impiegarci un sacco di tempo per la ricerca.
L'idea che mi è appena venuto in mente è quello di verificare la dimensione della lista e l'area del rettangolo, scegliendo il primo algoritmo se l'area è minore, altrimenti l'altro
aaa