2013-05-22 13 views
8

Próba zbudowania funkcji, która zwróci całkowitą nakładającą się odległość między 2 segmentami linii, oznaczonymi przez początkowe i końcowe numery int.Obliczanie odległości nakładania się dwóch segmentów linii 1D

Obecnie mam to: To ja wysiadłem z internetu gdzieś

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 

Działa to jednak w przypadku, 0 100 0,20 zwraca 100. I to wyraźnie źle. Czy istnieje prosty sposób obliczenia tego, który zwróci poprawne wartości?

Odpowiedz

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

Lubię taką prostą odpowiedź. –

6

Nie w pełni przetestowany, ale jak o -

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

w 1-D przesłanką kontrola nakładania jest proste (chyba). Znajdź większą z wartości minimum i mniejszą z wartości maximum. Następnie odejmij dwa.

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 

Wyniki

>>> 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 
Powiązane problemy