【发布时间】:2017-03-06 04:38:10
【问题描述】:
给定一维平面上的两条水平线。我想检查它们是否在任何时候重叠。
下面我展示了一些重叠的例子。请注意,[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
真的有这么复杂吗?难道没有更简单的方法来确定两条线是否重叠/一条线是否包含另一条线的一部分?
升力 通过查看否定条件
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;
}
【问题讨论】:
-
a.s < b.e and b.s < a.e. -
@n.m.感谢您的回复,但这是要添加的另一个条件吗?
-
不,这是全部条件。它取代了你的支票。它假设 a.s
-
可以看到只要判断一个起点是否进入另一行就足够了,所以只需要条件
if (l1.s > l2.s and l1.s < l2.e) or (l2.s > l1.s and l2.s < l1.e) return true -
@EmmanuelAC 您在使用
>的两个地方都需要>=:l1.s >= l2.s,l2.s >= l1.s(<保持<)。结果表达式等价于(l1.s < l2.e) and (l2.s < l1.e)。
标签: algorithm sorting logic intervals