在1维平面上给出两条水平线。我想检查它们是否在任何时候重叠。
下面我展示一些重叠的例子。请注意,[1,2]
和[2,3]
之间的时间间隔具有边框"触及"但它们并不相互重叠。
[1,2]
基本上是从x轴上的1到x轴上的2的线。
我的问题是,针对这种情况的详尽检查是什么。这些是我提出的,假设第一行被调用,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 :(得分: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