2013-05-22 15 views
8

開始点と終了点で表される2つの線分の間の重なりの総距離を返す関数を作成しようとしています。それは100を返します。そして、それは明らかに間違っている0,20、これは、0〜100の場合のためにしかし働き、私はどこかにインターネットを降りたこと、2つの1D線分の重なり距離を計算する

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 

現在、私はこれを持っています。 これを計算して正しい値を返す簡単な方法はありますか?

答えて

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

私は、このような簡単な答えが好きです。 –

6

完全にテストされたが、どのようにではない -

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

1-Dには、重複をチェックする前提は(私が思う)単純です。 minimumの値のうち大きい方と、maximumの値の小さい方を探します。次に、2つを減算します。

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 

結果

>>> 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 
関連する問題