2017-03-06 35 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

相关问题