2017-03-06 65 views
0

在1維平面上給定兩條水平線。我想檢查它們是否在任何時候重疊。檢查一條線是否包含另一條線的一部分

下面我顯示了一些重疊的例子。請注意,像[1,2][2,3]這樣的區間具有「碰觸」邊界,但它們並不相互重疊。 [1,2]基本上是一條從x軸上的1到x軸上的2條線。

enter image description here

我的問題是,什麼是詳盡組檢查了這樣的條件。這些是我想出的,假設第一行被稱爲a,第二行稱爲b。

b.s <= a.s && b.e > a.s 
b.s <= a.s && b.e >= a.e 
b.s < a.e && b.e >= a.e 
b.s > a.s && b.e < a.s 

這真的很複雜嗎?如果兩條線重疊/一條線包含另一條線,是不是有一個更簡單的方法?

Aliter 通過查看否定條件

public boolean isOverlap(Interval i1, Interval i2) 
    { 
//  if(i2.start <= i1.start && i2.end > i1.start) 
//   return true; 
//   
//  if(i2.start <= i1.start && i2.end >= i1.end) 
//   return true; 
//   
//  if(i2.start < i1.end && i2.end >= i1.end) 
//   return true; 
//   
//  if(i2.start >= i1.start && i2.end <= i1.end) 
//   return true; 
//   
//  return false; 

     if(i2.start <= i1.start && i2.end <= i1.start) 
      return false; 

     if(i2.start >= i1.end && i2.end >= i1.end) 
      return false; 

     return true; 
    } 
+0

'A.S

+0

@ n.m。感謝您的回覆,但這是另一個需要添加的條件嗎? – PepperBoy

+0

不,這是整個條件。它取代你的支票。它假定a

回答

1

的另一種方法是考慮它們在同一軸線上,並檢查不連貫。

然後你可以說「最左點是什麼?」

我將使用.l作爲「left」,使用.r作爲「right」。

leftmost = a.l < b.l ? a : b 
rightmost = leftmost == a ? b : a 

現在你知道最左邊一個和最右邊一個。爲了連接它們,最右邊的一個必須在最左邊的左邊和右邊之間有一個左邊的部分。

假定每行必須具有至少長度爲1,那麼您可以簡單地做:

connected = rightmost.l < leftmost.r ? true : false 
+0

不知道我是否完全理解了你的帖子,但是你使用的單詞無關性給了我一個想法,以檢查否定條件,因爲它比重疊的正面情況的數量少得多。令人驚訝的是,我得到了同樣的答案。這意味着,無論是正確的,或兩者都是錯誤的:)請看看上面的編輯,讓我知道你的想法。 – PepperBoy

+0

這應該工作。你也可以將它進一步縮小到一行。 N.M的版本似乎工作。 – FredMan

+0

爲什麼'connected =(rightmost.l

相關問題