2009-09-08 3 views
5

Nous espérons que cette question mathématique est très simple. Si j'ai deux séries de numéros, ce qui est la façon la plus simple et la plus efficace pour vérifier si elles entrent en conflit, par exemple:Détection de la collision de deux plages de nombres

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 

J'ai actuellement ce gâchis, mais il doit y avoir un moyen beaucoup plus simple de faire cette vérification:

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

Répondre

11

Eh bien, assurez-vous que vous avez des paires bien ordonnée (probablement une bonne idée de toute façon, selon ce que vous envisagez de faire avec eux):

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; 
} 

alors vous devriez être en mesure de simplifier à:

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

Modifier: Whoops, a ce test en arrière! Essayez:

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

J'allais juste poster ça :-) +1 pour être plus rapide. –

+6

ou, sans négation: '$ clash = ($ b1 <= $ a2) && ($ a1 <= $ b2)' – sth

+0

Merci, c'est génial. –

2

Les gammes nE heurtent si et seulement si $ a2 < = $ b1 a1 ou $> $ = b2 (en supposant que les plages sont données sous forme de paires ordonnées). Maintenant niez la condition.

+1

Et si $ a1> = $ b2? Ne se heurte pas alors non plus. –

+0

Nous supposons également qu'il est toujours le cas que $ a1 <$ a2 et $ b1 <$ b2. –

+0

@Matthew: Right @jeffamaphone: Eh bien, c'est ce que vous voulez dire par "plage", n'est-ce pas? –

7

Je pense qu'il devrait être aussi simple que cela:

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

Qu'est-ce que vous cherchez est l'intersection des tableaux. http://us3.php.net/array_intersect

Fondamentalement,

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

Si des éléments sont dans les deux arr1 de $ et arr2 $, puis $ entrecoupent listera ces valeurs. L'appel count() renvoie 1 (ou plus), donc faire> 0 vous donne si $ arr1 et $ arr2 ont des éléments similaires.

3

exemple:
10 - 20
4 - 11 // cela va entrer en conflit avec au-dessus
: 1 - 5 // cela va entrer en conflit avec au-dessus
40 - 50
magasin vos numéros en 2 tableaux, disent
x_array = array (10,4,11,40);
y_array = array (20,11,5,50);

asort ($ x_array); // trier uniquement les valeurs du premier tableau x et maintenir l'index
$ max_val = -1;
$ last_index = 0;
foreach ($ x_array comme each_index $ => $ each_x) {
    // obtenir la valeur correspondante 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 "Erreur: chevauchement entre: ($ each_x, $ this_y) et ($ last_x, $ last_y)";
   
    $ last_index = $ each_index;
}