检查一行是否包含另一行

时间:2017-03-06 04:38:11

标签: algorithm sorting logic intervals

在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;
    }

1 个答案:

答案 0 :(得分:1)

另一种方法是在同一轴上考虑它们并检查断开连接。

然后你可以说&#34;最左边的点是什么?&#34;

我将.l用于&#34;左&#34;和#r;&#34;对。&#34;

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

现在您知道最左侧和最右侧的一个。为了使它们连接,最右边的一个必须在最左边的一个左右之间留有一个左边部分。

假设每一行必须至少有1个长度,那么你可以这样做:

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