require 'bizzieLibrary' $eqEpsilon = 0.0000000000001 def approxEq(a, b) return (abs(a - b) < $eqEpsilon) end # source: http://geometryalgorithms.com/Archive/algorithm_0104/algorithm_0104B.htm def intersectionPoint(lineA, lineB) v = lineA.vect vPerp = lineA.vect.perp u = lineB.vect uPerp = lineB.vect.perp dpA = vPerp.dotProduct(u) if (!approxEq(dpA, 0.0)) w = lineB.p1 - lineA.p1 s1 = -1.0 * (vPerp.dotProduct(w)) / dpA t1 = -1.0 * (uPerp.dotProduct(w)) / dpA if 0.0 <= s1 && s1 <= 1.0 && 0.0 <= t1 && t1 <= 1.0 return lineB.doPathPoint(s1) else return nil end else return nil end end def allIntersections(lines) intersections = [] linePairs = getGroups(lines) linePairs.each do |linePair| intersection = intersectionPoint(linePair[0], linePair[1]) if (intersection != nil) intersections << intersection #puts intersection.x.to_s + ", " + intersection.y.to_s end end return intersections end def lineContainsPoint?(line, point) dx = line.p2.x - line.p1.x if dx != 0.0 s = (point.x - line.p1.x)/dx if 0.0 <= s && s <= 1.0 return approxEq(point.y, line.p1.y + (line.p2.y - line.p1.y) * s) else return false end else if !approxEq(line.p1.x, point.x) return false else return inInterval?(point.y, line.p1.y, line.p2.y) end end end # returns true if lineA contains lineB def lineContainsLine?(lineA, lineB) return lineContainsPoint?(lineA, lineB.p1) && lineContainsPoint?(lineA, lineB.p2) end =begin # either takes a line object or a ptA1 = Point2d.new(0.0, 0.0) ptA2 = Point2d.new(1.0, 0.0) ptB1 = Point2d.new(0.5, 0.5) ptB2 = Point2d.new(0.5, -0.5) ptC1 = Point2d.new(0.1, 0.0) ptC2 = Point2d.new(0.9, 0.0) lineA = Line2d.new(ptA1, ptA2) lineB = Line2d.new(ptB1, ptB2) lineC = Line2d.new(ptC1, ptC2) lineD = Line2d.new(ptA1, ptC2) lineE = Line2d.new(ptC1, ptA2) lineF = Line2d.new(ptA2, ptA1) lineG = Line2d.new(ptC2, ptC1) lineH = Line2d.new(ptC2, ptB1) puts intersectionPoint(lineA, lineB) puts lineContainsLine?(lineA, lineA) puts lineContainsLine?(lineA, lineB) puts lineContainsLine?(lineA, lineC) puts lineContainsLine?(lineA, lineD) puts lineContainsLine?(lineA, lineE) puts lineContainsLine?(lineA, lineF) puts lineContainsLine?(lineA, lineG) puts lineContainsLine?(lineA, lineH) =end