2013-05-22 9 views
8

Der Versuch, eine Funktion zu erstellen, die den gesamten überlappenden Abstand zwischen zwei Liniensegmenten zurückgibt, bezeichnet als Start- und End-Ints.Berechnung der Überlappungsdistanz von zwei 1D-Liniensegmenten

Zur Zeit habe ich dies: Dass ich das Internet irgendwo ausstieg,

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 

Dies funktioniert jedoch für den Fall von 0 100, 0,20 kehrt 100. Und das ist eindeutig falsch. Gibt es eine einfache Möglichkeit, dies zu berechnen, die die richtigen Werte zurückgibt?

Antwort

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

ich so eine einfache Antwort mögen. –

6

nicht vollständig getestet, aber wie wäre es -

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 ist die Prämisse für Überlappungen der Überprüfung einfach ist (glaube ich). Finden Sie den größeren der minimum Werte und den kleineren der maximum Werte. Dann subtrahiere die beiden.

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 

Ergebnisse

>>> 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 
Verwandte Themen