/ src / __comm__ / __line_intersection.scad
__line_intersection.scad
 1  function __line_intersection2(line_pts1, line_pts2, ext, epsilon = 0.0001) = 
 2      let(
 3          a1 = line_pts1[0],
 4          a2 = line_pts1[1],
 5          b1 = line_pts2[0],
 6          b2 = line_pts2[1],
 7          a = a2 - a1, 
 8          b = b2 - b1,
 9          c = cross(a, b)
10      ) 
11      abs(c) < epsilon ? [] :  // they are parallel or conincident edges
12      let(
13           t = cross(b1 - a1, b) /  c,
14           p = a1 + a * t
15      )
16      ext ? p :
17      let(u = -cross(a1 - b1, a) / c)
18      t >= 0 && t <= 1 && u >= 0 && u <= 1 ? p : [];
19  
20  function v_scalar(v1, v2) = 
21      let(s = norm(v1) / norm(v2))
22      s * v2 == v1 ? s : -s;
23  
24  function __line_intersection3(line_pts1, line_pts2, ext, epsilon = 0.0001) = 
25      let(
26          a1 = line_pts1[0],
27          a2 = line_pts1[1],
28          b1 = line_pts2[0],
29          b2 = line_pts2[1],
30          a = a2 - a1, 
31          b = b2 - b1,
32          c = cross(a, b)
33      ) 
34      cross(a, b1 - a1) * (b2 - a1) != 0 ||   // they aren't coplanar
35      norm(c) < epsilon ? [] :                // they are parallel or conincident edges
36      let(
37           t = v_scalar(cross(b1 - a1, b), c), 
38           p = a1 + a * t
39      )
40      ext ? p :
41      let(u = v_scalar(cross(a1 - b1, a), -c))
42      t >= 0 && t <= 1 && u >= 0 && u <= 1 ? p : [];