找到重叠区间的整洁算法是什么?

时间:2011-02-02 20:08:19

标签: algorithm geometry

我确信之前一定会被问过,但我找不到它:我只是找到相关的,但更难的问题。

我有四点,代表两行:

       A         C      B   D
|------*---|-----+----|-*---+---|----------|
0          10         20        30         40

因此,在示例中,AB = {7, 21}CD = {16,26}。 (这些线可以是彼此之间的任何关系,也可以是任何尺寸。)我想知道它们是否重叠,以及它是否重叠。 (在这个例子中,答案是5.)我当前的解决方案涉及一堆复杂的if / then步骤,我不禁想到有一个很好的算术解决方案。有吗?

(P.S。真的,我正在进行边界框交叉,但如果我能在一个维度上得到它,那么另一个将是相同的,显然。)

2 个答案:

答案 0 :(得分:19)

试试这个:

intersects = (max(a,b) > min(c,d)) && (min(a,b) < max(c,d))
overlap = min(max(a,b), max(c,d)) - max(min(c,d), min(a,b))

如果您可以假设a <= bc <= d

intersects = (b > c) && (a < d)
overlap = min(b, d) - max(c, a)

您还可以按如下方式计算intersects

intersects = (overlap > 0)

答案 1 :(得分:0)

线段是两条相对光线的交点(两条相反方向的半无限线)。你有两个相交的线段 - 结果是所有4条光线的交集。因此,您可以将代码视为三个连续的光线交叉点:左侧光线的左侧与右侧光线的右侧相交。

(这是陈述现在接受的答案的另一种方式。)

相关问题