Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Because the box is axis-aligned, all you need to do is to check for interval intersection in each coordinate.</p> <p>Here is an example in python, with some tests. Note that it is generic for N dimensions, and it is the same algorithm for box-box intersection:</p> <pre><code>def are_intervals_intersecting(a0, a1, b0, b1): ''' @param a0: float @param a1: float @param b0: float @param b1: float ''' if (a1 &lt; a0): a1, a0 = a0, a1 if (b1 &lt; b0): b1, b0 = b0, b1 # 6 conditions: # 1) # a0 ---------- a1 a0 &lt; b0 and a1 &lt; b0 # b0 ---------- b1 (no intersection) # 2) # a0 ---------- a1 # b0 ---------- b1 (intersection) # 3) # a0 ------------------------ a1 # b0 ---------- b1 (intersection) # 4) # a0 ---------- a1 # b0 ------------------------ b1 (intersection) # 5) # a0 ---------- a1 (intersection) # b0 ---------- b1 # 6) # a0 ---------- a1 b0 &lt; a0 and b1 &lt; a0 # b0 ---------- b1 (no intersection) if b0 &lt; a0: # conditions 4, 5 and 6 return a0 &lt; b1 # conditions 4 and 5 else: # conditions 1, 2 and 3 return b0 &lt; a1 # conditions 2 and 3 def is_segment_intersecting_box(P0, P1, B0, B1): ''' @param P0: tuple(float) @param P1: tuple(float) @param B0: tuple(float) @param B1: tuple(float) ''' for i in xrange(len(P0)): if not are_intervals_intersecting(P0[i], P1[i], B0[i], B1[i]): return False return True if __name__ == '__main__': assert not is_segment_intersecting_box( (0.0, 0.0, 0.0), (1.0, 1.0, 1.0), (2.0, 2.0, 2.0), (3.0, 3.0, 3.0)) assert not is_segment_intersecting_box( (0.0, 0.0, 0.0), (4.0, 1.0, 1.0), (2.0, 2.0, 2.0), (3.0, 3.0, 3.0)) assert not is_segment_intersecting_box( (1.5, 1.5, 0.0), (4.0, 2.5, 1.0), (2.0, 2.0, 2.0), (3.0, 3.0, 3.0)) assert is_segment_intersecting_box( (1.5, 1.5, 0.0), (4.0, 2.5, 2.5), (2.0, 2.0, 2.0), (3.0, 3.0, 3.0)) assert is_segment_intersecting_box( (1.5, 1.5, 1.5), (2.5, 2.5, 2.5), (2.0, 2.0, 2.0), (3.0, 3.0, 3.0)) assert is_segment_intersecting_box( (2.5, 2.5, 2.5), (2.6, 2.6, 2.6), (2.0, 2.0, 2.0), (3.0, 3.0, 3.0)) assert is_segment_intersecting_box( (2.5, 2.5), (2.5, 3.5), (2.0, 2.0), (3.0, 3.0)) print 'ok' </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload