function findLineIntersection (line1, line2) { let formula1 = getLineFormula(line1); let formula2 = getLineFormula(line2); let x = (formula2.c - formula1.c)/(formula1.m - formula2.m); let y = formula1.m*x + formula1.c; return {'x': x, 'y': y}; } function findCircleIntersection(line, circle) { let lineFormula = getLineFormula(line); // 1 + m^2 let a = 1 + Math.pow(lineFormula.m, 2); // 2mc - 2mk - 2h -> 2mc since k & h are 0 let b = 2*lineFormula.m*lineFormula.c; // h^2 + c^2 + k^2 - r^2 - 2ck -> c^2 - r^2 since k & h are 0 let c = Math.pow(lineFormula.c, 2) - Math.pow(circle.r, 2); let discriminant = Math.pow(b, 2) - 4*a*c; let x1 = (-b + Math.sqrt(discriminant))/(2*a); let x2 = (-b - Math.sqrt(discriminant))/(2*a); let x = checkIfInBound(x1, x2, line); let y = lineFormula.m*x + lineFormula.c; return {'x': x, 'y': y}; } function extendLineToCircle(line, circle) { let lineFormula = getLineFormula(line); // 1 + m^2 let a = 1 + Math.pow(lineFormula.m, 2); // 2mc - 2mk - 2h -> 2mc since k & h are 0 let b = 2*lineFormula.m*lineFormula.c; // h^2 + c^2 + k^2 - r^2 - 2ck -> c^2 - r^2 since k & h are 0 let c = Math.pow(lineFormula.c, 2) - Math.pow(circle.r, 2); let discriminant = Math.pow(b, 2) - 4*a*c; let x1 = (-b + Math.sqrt(discriminant))/(2*a); let x2 = (-b - Math.sqrt(discriminant))/(2*a); return {x1: x1, y1: lineFormula.m*x1 + lineFormula.c, x2: x2, y2: lineFormula.m*x2 + lineFormula.c}; } function getLineFormula (line) { let rise = line.y2-line.y1; let run = line.x2-line.x1; run = run ? run : -0.000001; let m = Math.round(rise*1000/run)/1000; let c = Math.round((line.y1 - m*line.x1)*1000)/1000; return {'m': m, 'c': c}; } function checkIfInBound(x1, x2, line) { if (Math.min(line.x1, line.x2) <= x1 && Math.max(line.x1, line.x2) >= x1) { return x1; } return x2; }