检查一行是否包含另一行的一部分
Check if one line contains a part of the other
给定一维平面上的两条水平线。我想检查它们是否在任何时候重叠。
下面我展示了一些重叠的例子。请注意,[1,2]
和 [2,3]
等间隔具有边界 "touching",但它们不会相互重叠。
[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
真的有这么复杂吗?有没有更简单的方法来判断两行 overlap/one 行是否包含另一行的一部分?
阿利特
通过查看否定条件
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;
}
另一种方法是在同一轴上考虑它们并检查断开连接。
那你可以说"what is the left most point?"
我将为 "left" 使用 .l,为 "right." 使用 .r
leftmost = a.l < b.l ? a : b
rightmost = leftmost == a ? b : a
现在你知道最左边和最右边了。为了将它们连接起来,最右边的必须在最左边的左边和右边之间有一个左边的部分。
假设每一行的长度至少为 1 那么你可以简单地做:
connected = rightmost.l < leftmost.r
给定一维平面上的两条水平线。我想检查它们是否在任何时候重叠。
下面我展示了一些重叠的例子。请注意,[1,2]
和 [2,3]
等间隔具有边界 "touching",但它们不会相互重叠。
[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
真的有这么复杂吗?有没有更简单的方法来判断两行 overlap/one 行是否包含另一行的一部分?
阿利特 通过查看否定条件
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;
}
另一种方法是在同一轴上考虑它们并检查断开连接。
那你可以说"what is the left most point?"
我将为 "left" 使用 .l,为 "right." 使用 .r
leftmost = a.l < b.l ? a : b
rightmost = leftmost == a ? b : a
现在你知道最左边和最右边了。为了将它们连接起来,最右边的必须在最左边的左边和右边之间有一个左边的部分。
假设每一行的长度至少为 1 那么你可以简单地做:
connected = rightmost.l < leftmost.r