intersection_of_two_lines.sf 846 B

12345678910111213141516171819202122232425262728293031
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Find_the_intersection_of_two_lines
  4. #
  5. func det(a, b, c, d ) { a*d - b*c }
  6. func intersection(ax, ay, bx, by,
  7. cx, cy, dx, dy ) {
  8. var detAB = det(ax,ay, bx,by)
  9. var detCD = det(cx,cy, dx,dy)
  10. var ΔxAB = (ax - bx)
  11. var ΔyAB = (ay - by)
  12. var ΔxCD = (cx - dx)
  13. var ΔyCD = (cy - dy)
  14. var x_numerator = det(detAB, ΔxAB, detCD, ΔxCD)
  15. var y_numerator = det(detAB, ΔyAB, detCD, ΔyCD)
  16. var denominator = det( ΔxAB, ΔyAB, ΔxCD, ΔyCD)
  17. denominator == 0 && return 'lines are parallel'
  18. [x_numerator / denominator, y_numerator / denominator]
  19. }
  20. say ('Intersection point: ', intersection(4,0, 6,10, 0,3, 10,7))
  21. say ('Intersection point: ', intersection(4,0, 6,10, 0,3, 10,7.1))
  22. say ('Intersection point: ', intersection(0,0, 1,1, 1,2, 4,5))