2016-10-16 4 views
0

私の関数は、線を表現する2つのオブジェクトをとり、それらが重なっているかどうかを返します。オーバーラップは "true"を返しますが、オーバーラップしない場合はfalseを返さないようです。どんな考え?2つの行が重なり合っているかどうかを調べるにはどうすればよいですか?

function checkOverlap(line1, line2) { 
    if(line2.start <= line1.end || line1.start <=line2.end) { 
    return true 
    } else { 
    return false 
    } 
} 
+0

あなたはどのようなコードを試してみましたか? –

答えて

0

ある行の開始が他の行の開始と終了の間にあるかどうかをチェックする必要があります。

if((line2.start <= line1.end && line2.start >=line1.start) || (line1.start <=line2.end && line1.start >= line2.start)) { 
     return true; 
    } 
+0

ありがとうございます。私はあなたのif文を試して、elseを追加しました(else:false)。それは私に "重複"のための "真の"結果を与えますが、 "重ならない"ための誤った結果はもたらしません。私は他の声明に何かをしなければならないのですか? –

+0

私は編集しました。これで、ある行の開始が他の行の開始と終了の間にあるかどうかを確認します。 – bluebee

+0

本当にありがとう。 –

0

あなたはline2.startがLINE1であるが、最後またはline1.startでLINE2にではなく、それは終わりだに位置していないことを確認する必要があります。

if ((line2.start >= line1.start and line2.start < line1.end) 
    OR (line1.start >= line2.start and line1.start < line2.end)) { 
    // We have an overlap 
} 
0

これは最も単純なロジックです。

A.start <= B.end && B.start <= A.end

それは...あなたは(重複仮定)両方の範囲に存在するいくつかの点、Xを、考慮すれば、これは理にかなっている理由は簡単だ

A (start)-------- X --------(end) 
B  (start)---- X -------------(end) 

開始を押して想像して彼らはXを越えることができないという要件で終わります(そうであれば、Xはもう両方の範囲にはありません)。開始は常にB終了の前にあり、逆もまた同様です。

エッジをどのように処理するかによって、<=<を微調整できます。

console.clear() 
 
let l = console.log 
 

 
function checkOverlap(A, B){ 
 
    return (A.start <= B.end && B.start <= A.end) 
 
} 
 

 
// Checking All combinations 
 
l(checkOverlap({start: 0, end: 2},{start: 3, end: 5})) // false 
 
l(checkOverlap({start: 0, end: 4},{start: 3, end: 5})) // true 
 
l(checkOverlap({start: 0, end: 6},{start: 3, end: 5})) // true 
 

 
l(checkOverlap({start: 3, end: 5},{start: 0, end: 2})) // false 
 
l(checkOverlap({start: 3, end: 5},{start: 0, end: 4})) // true 
 
l(checkOverlap({start: 3, end: 5},{start: 0, end: 6})) // true

関連する問題