'use strict' module.exports = solveIntersection var ratMul = require('big-rat/mul') var ratDiv = require('big-rat/div') var ratSub = require('big-rat/sub') var ratSign = require('big-rat/sign') var rvSub = require('rat-vec/sub') var rvAdd = require('rat-vec/add') var rvMuls = require('rat-vec/muls') function ratPerp (a, b) { return ratSub(ratMul(a[0], b[1]), ratMul(a[1], b[0])) } // Solve for intersection // x = a + t (b-a) // (x - c) ^ (d-c) = 0 // (t * (b-a) + (a-c) ) ^ (d-c) = 0 // t * (b-a)^(d-c) = (d-c)^(a-c) // t = (d-c)^(a-c) / (b-a)^(d-c) function solveIntersection (a, b, c, d) { var ba = rvSub(b, a) var dc = rvSub(d, c) var baXdc = ratPerp(ba, dc) if (ratSign(baXdc) === 0) { return null } var ac = rvSub(a, c) var dcXac = ratPerp(dc, ac) var t = ratDiv(dcXac, baXdc) var s = rvMuls(ba, t) var r = rvAdd(a, s) return r }