2013-05-22 3 views
8

Tentativo di creare una funzione che restituisca la distanza di sovrapposizione totale tra 2 segmenti di linea, indicati da iniziali e finali.Calcolo della distanza di sovrapposizione di due segmenti di linea 1D

Attualmente ho questo: Che ho avuto da internet da qualche parte,

def overlap(min1, max1, min2, max2): 
    """returns the overlap between two lines that are 1D""" 
    result = None 
    if min1 >= max2 or min2 >= max1: result = 0 
    elif min1 <= min2: 
     result = max1 - min2 
    else: result = max2 - min1 
    return result 

Questo funziona però per il caso di 0 100, 0,20 restituisce 100. E questo è chiaramente sbagliato. Esiste un modo semplice per calcolare ciò che restituirà i valori corretti?

risposta

23
def overlap(min1, max1, min2, max2): 
    return max(0, min(max1, max2) - max(min1, min2)) 

>>> overlap(0, 10, 80, 90) 
0 
>>> overlap(0, 50, 40, 90) 
10 
>>> overlap(0, 50, 40, 45) 
5 
>>> overlap(0, 100, 0, 20) 
20 
+1

mi piace una risposta così semplice. –

6

Non completamente testato, ma come circa -

def overlap(min1,max1,min2,max2): 
    start = max(min1,min2) 
    end = min(max1,max2) 
    d = end - start 
    if d < 0: 
     return 0 
    else: 
     return d 

#some tests 
print overlap(0,100,0,20) 
print overlap(5,10,15,20) 
print overlap(1,3,0,5) 
print overlap(-5,5,-2,10) 

>>> 
20 
0 
2 
7 
0

In 1-D la premessa di controllo per le sovrapposizioni è semplice (credo). Trova il più grande dei valori minimum e il più piccolo dei valori maximum. Quindi sottrarre i due.

def overlap(min1, max1, min2, max2): 
    #Find out the bigger minimum 
    if min1 >= min2: 
     bigger_min = min1 
    else: 
     bigger_min = min2 
    if max1 >= max2: 
     smaller_max = max2 
    else: 
     smaller_max = max1 
    if smaller_max <= bigger_min: 
     return 0 
    else: 
     return smaller_max - bigger_min 

Risultati

>>> overlap(20,40,30,70) 
10 
>>> overlap(0,100,200,300) 
0 
>>> overlap(0,100,0,30) 
30 
>>> overlap(0,100,30,60) 
30 
>>> overlap(0,100,30,70) 
40 
>>> overlap(20,100,30,70) 
40 
>>> overlap(20,30,30,70) 
0 
>>> overlap(0,50,0,50) 
50