【问题标题】:Check if one line contains a part of the other检查一行是否包含另一行的一部分
【发布时间】: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 &lt; b.e and b.s &lt; a.e.
  • @n.m.感谢您的回复,但这是要添加的另一个条件吗?
  • 不,这是全部条件。它取代了你的支票。它假设 a.s
  • 可以看到只要判断一个起点是否进入另一行就足够了,所以只需要条件if (l1.s &gt; l2.s and l1.s &lt; l2.e) or (l2.s &gt; l1.s and l2.s &lt; l1.e) return true
  • @EmmanuelAC 您在使用&gt; 的两个地方都需要&gt;=l1.s &gt;= l2.sl2.s &gt;= l1.s&lt; 保持&lt;)。结果表达式等价于(l1.s &lt; l2.e) and (l2.s &lt; l1.e)

标签: algorithm sorting logic intervals


【解决方案1】:

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

那你可以说“最左边的点是什么?”

我将使用 .l 表示“左”,使用 .r 表示“右”。

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

现在你知道最左边的和最右边的了。为了使它们连接起来,最右边的一个必须在最左边的左右之间有一个左侧。

假设每一行的长度必须至少为 1,那么您可以简单地这样做:

connected = rightmost.l < leftmost.r 

【讨论】:

  • 不确定我是否完全理解了您的帖子,但是您使用的断开连接这个词给了我一个想法,以检查否定条件,因为它比重叠的积极场景的数量要少得多。令人惊讶的是,我得到了相同的答案。这意味着,要么都是对的,要么都是错的 :) 请看看上面的编辑,让我知道你的想法。
  • 应该可以。您还可以将其进一步减少为单行。 N.M 的版本似乎有效。
  • 为什么不connected = (rightmost.l &lt; leftmost.r ? true : false) ? true : false
  • 已连接 = ((rightmost.l
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
  • 2018-10-22
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多