2009-09-08 9 views
5

Questa è sperabilmente una domanda di matematica molto semplice. Se ho due gamme di numero, qual è il modo più semplice ed efficace per controllare se sono scontrano, ad esempio:Rilevare se due intervalli di numeri si scontrano

10-20 and 11-14 // clash as B is contained in A 
11-15 and 20-22 // don't clash 
24-26 and 20-30 // clash as A is contained in B 
15-25 and 20-30 // clash as they overlap at each end 

Al momento ho questo pasticcio, ma ci deve essere un modo molto più semplice per fare questo controllo:

$clash = ($b1 >= $a1 && $b1 <= $a2) 
    || ($b2 >= $a1 && $b2 <= $a2) 
    || ($a1 >= $b1 && $a1 <= $b2) 
    || ($a2 >= $b1 && $a2 <= $b2); 

risposta

11

Beh, prima assicurarsi di aver coppie ben ordinata (probabilmente una buona idea in ogni caso, a seconda di cosa avete intenzione di fare con loro):

if($a1 > $a2) { 
    // swap $a1 and $a2 
    $temp = $a1; 
    $a1 = $a2; 
    $a2 = $temp; 
} 
if($b1 > $b2) { 
    // swap $b1 and $b2 
    $temp = $b1; 
    $b1 = $b2; 
    $b2 = $temp; 
} 

allora si dovrebbe essere in grado di semplificare a:

$clash = ($a2 <= $b1) || ($a1 >= $b2); 

Edit: Ops, ottenuto che prova a ritroso! Prova:

$clash = !(($a2 <= $b1) || ($a1 >= $b2)); 
+0

Stavo andando a postare :-) +1 per essere più veloce. –

+6

o, senza negazione: '$ clash = ($ b1 <= $ a2) && ($ a1 <= $ b2)' – sth

+0

Grazie, è grandioso. –

2

Gli intervalli NON scontrano se e solo se $ a2 < = $ b1 o $ a1> = $ b2 (supponendo che gli intervalli sono dati come coppie ordinate). Adesso nega la condizione.

+1

Cosa succede se $ a1> = $ b2? Non si scontra neanche –

+0

Supponiamo anche che sia sempre il caso $ a1 <$ a2 e $ b1 <$ b2. –

+0

@Matthew: Right @jeffamaphone: Beh, questo è ciò che intendi per "intervallo", non è vero? –

7

penso che dovrebbe essere semplice come questo:

clash = A_LOW <= B_HIGH AND A_HIGH >= B_LOW 
0

Quello che stai cercando è l'intersezione degli array. http://us3.php.net/array_intersect

In sostanza,

$intersect = array_intersect($arr1, $arr2); 
$clash = (count($intersect) > 0); 

Se alcuni elementi sono in entrambi $ arr1 e $ arr2, allora $ intersecano sarà elencare tali valori. La chiamata count() restituisce 1 (o più), quindi fare> 0 ti dà se $ arr1 e $ arr2 hanno elementi simili.

3

esempio:
10 - 20
4 - 11 // essere in contrasto con sopra
: 1 - 5 // essere in contrasto con superiore
40 - 50
memorizzare i numeri in 2 array, dicono
x_array = array (10,4,11,40);
y_array = array (20,11,5,50);

asort ($ x_array); // ordina solo i primi valori dell'array gamma x e mantiene l'indice
$ max_val = -1;
$ last_index = 0;
foreach ($ x_array da $ each_index => $ each_x) {
    // ottenere il corrispondente valore y
    $ this_y = $ y_array [$ each_index];
    echo "$ this_y < $ max_val";
    if ($ each_x> $ max_val & & $ this_y> $ max_val) {
        $ max_val = $ this_y;
   }
    else {
        $ last_x = $ x_array [$ last_index];
        $ last_y = $ y_array [$ last_index];
        echo "Errore: Sovrapposizione tra: ($ each_x, $ this_y) e ($ last_x, $ last_y)";
   }
    $ last_index = $ each_index;
}

Problemi correlati