線分の交点(Ruby)

4点 があるとき、線分 の交点を求めるメソッド。
 

require 'matrix'

def cross(x1, y1, x2, y2, x3, y3, x4, y4)
  a = Matrix[[x2 - x1, x3 - x4], [y2 - y1, y3 - y4]]
           .lup.solve([x3 - x1, y3 - y1]) rescue nil
  return nil unless a
  s, t = a[0], a[1]
  f = ((0 <= s and s <= 1) and (0 <= t and t <= 1))
  f ? Vector[x1 + s * (x2 - x1), y1 + s * (y2 - y1)] : nil
end

交点(端点でも OK)があれば Vector で返し、なければ nil を返します。

標準添付ライブラリを使わない場合。Vector の代わりに配列を返します。

def cross(x1, y1, x2, y2, x3, y3, x4, y4)
  l = (x2 - x1) * (y4 - y3) - (y2 - y1) * (x4 - x3)
  return nil if l.zero?
  vx, vy = x3 - x1, y3 - y1
  s = Rational((y4 - y3) * vx - (x4 - x3) * vy, l)
  t = Rational((y2 - y1) * vx - (x2 - x1) * vy, l)
  f = ((0 <= s and s <= 1) and (0 <= t and t <= 1))
  f ? [x1 + s * (x2 - x1), y1 + s * (y2 - y1)] : nil
end

 
線分でなくて直線の交点の場合は、メソッドでの s, t の範囲のチェックをおこなわなければよいです。