我确信之前一定会被问过,但我找不到它:我只是找到相关的,但更难的问题。
我有四点,代表两行:
A C B D
|------*---|-----+----|-*---+---|----------|
0 10 20 30 40
因此,在示例中,AB = {7, 21}
和CD = {16,26}
。 (这些线可以是彼此之间的任何关系,也可以是任何尺寸。)我想知道它们是否重叠,以及它是否重叠。 (在这个例子中,答案是5.)我当前的解决方案涉及一堆复杂的if / then步骤,我不禁想到有一个很好的算术解决方案。有吗?
(P.S。真的,我正在进行边界框交叉,但如果我能在一个维度上得到它,那么另一个将是相同的,显然。)
答案 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 <= b
和c <= d
:
intersects = (b > c) && (a < d)
overlap = min(b, d) - max(c, a)
您还可以按如下方式计算intersects
:
intersects = (overlap > 0)
答案 1 :(得分:0)
线段是两条相对光线的交点(两条相反方向的半无限线)。你有两个相交的线段 - 结果是所有4条光线的交集。因此,您可以将代码视为三个连续的光线交叉点:左侧光线的左侧与右侧光线的右侧相交。
(这是陈述现在接受的答案的另一种方式。)