questo è un problema che ho risolto in passato. La prima cosa è ordinare i rettangoli usando il valore x o y di uno dei bordi. Diciamo che ordinate nella direzione y e usate il bordo superiore. Il rettangolo più in alto nell'esempio è il primo in ordine. Per ogni rettangolo conosci la sua dimensione nella direzione y.
Ora, per ogni voce (chiamarla la voce corrente, corrisponde a un rettangolo) nell'elenco ordinato si ricerca in avanti attraverso l'elenco fino a raggiungere una voce superiore alla voce corrente + la dimensione del rettangolo corrispondente. (chiamalo la voce di arresto)
Qualsiasi voce nell'elenco ordinato tra la voce corrente e questa voce di arresto saranno potenziali intersezioni. Basta controllare se i rettangoli x-intervalli si intersecano.
Quando si sceglie di ordinare nella direzione x o y, sarà preferibile scegliere la dimensione più grande in quanto ciò implicherà meno intersezioni in media, quindi meno controllo.
Ecco un esempio. Rettangoli sono definiti come R (x1, x2, y1, y2) dove X1 è il lato sinistro, x2 è destra, y1 è alto e y2 è inferiore
rectangle 1 (1,5,0,4)
rectangle 2 (7,9,6,8)
rectangle 3 (2,4,2,3)
rectangle 4 (3,6,3,7)
rectangle 5 (3,6,9,15)
ordinamento secondo y1 invia
# y1 size
rectangle 1 0 4
rectangle 3 2 3
rectangle 4 3 4
rectangle 2 6 2
rectangle 5 9 6
quindi, il rettangolo 1 ha y1 + dimensione = 0 + 4 = 4 che implica intersecherà potenzialmente il rettangolo 3 (valore y1 = 3 < 4) e il rettangolo 4 (valore y1 = 3 < 4) ma non il rettangolo 2 (valore y1 = 6> 4) ... non è necessario controllare i rettangoli nell'elenco dopo 2
Rectangle 3 ha y2 + size = 2 + 3 = 5 che implica potrebbe intersecare il rettangolo 4 (valore y1 = 3 < 5) ma non ripetere 2 (valore y1 = 6> 5) non è necessario controllare i rettangoli nell'elenco dopo 2
Il rettangolo 4 ha y2 + size = 3 + 4 = 7 che implica che intersecherà potenzialmente il rettangolo 2 (valore y1 = 6 < 7) ma non si ripeterà 5 (valore y1 = 9> 7)
Naturalmente, con un numero elevato di rettangoli in genere dovrai solo controllare una frazione delle possibili coppie per l'intersezione.
qual è il pensiero per il rettangolo rosso che rivendica lo spazio che avrebbe potuto essere reclamato dai rettangoli verdi o arancioni (rendendoli più lunghi ...)? –
Ho diviso arbitrariamente quel rettangolo. –
Si scopre che questo è proprio quello che volevo: http://google-maps-utility-library-v3.googlecode.com/svn/trunk/routeboxer/docs/examples.html Probabilmente avrei dovuto chiedere un soluzione al problema reale invece di una soluzione al problema che ho creato nel bel mezzo della mia implementazione. –