paper.PathItem.prototype.getIntersections = function(path) {
  // First check the bounds of the two paths. If they don't intersect,
  // we don't need to iterate through their curves.
  if (!this.getBounds().touches(path.getBounds()))
    return [];
  var locations = [],
    curves1 = this.getCurves(),
    curves2 = path.getCurves(),
    length2 = curves2.length,
    values2 = [];
  for (var i = 0; i < length2; i++)
    values2[i] = curves2[i].getValues();
  for (var i = 0, l = curves1.length; i < l; i++) {
    var curve = curves1[i],
      values1 = curve.getValues();
    for (var j = 0; j < length2; j++)
      Curve.getIntersections(values1, values2[j], curve, curves2[j], locations);
  }
  return locations;
};


paper.Curve.getIntersections = function(v1, v2, curve, curve2, locations) {
    var bounds1 = this.getBounds(v1),
      bounds2 = this.getBounds(v2);
    if (bounds1.touches(bounds2)) {
      // See if both curves are flat enough to be treated as lines, either
      // because they have no control points at all, or are "flat enough"
      if ((this.isLinear(v1)
          || this.isFlatEnough(v1, /*#=*/ Numerical.TOLERANCE))
        && (this.isLinear(v2)
          || this.isFlatEnough(v2, /*#=*/ Numerical.TOLERANCE))) {
        // See if the parametric equations of the lines interesct.
        var point = new Line(v1[0], v1[1], v1[6], v1[7], false)
            .intersect(new Line(v2[0], v2[1], v2[6], v2[7], false));
        if (point) {
          // Avoid duplicates when hitting segments (closed paths too)
          var first = locations[0],
            last = locations[locations.length - 1];
          if ((!first || !point.equals(first._point))
              && (!last || !point.equals(last._point))){
            // Passing null for parameter leads to lazy determination
            // of parameter values in CurveLocation#getParameter()
            // only once they are requested.
            var cloc = new CurveLocation(curve, null, point);
            var cloc2 = new CurveLocation(curve2, null, point)
            cloc2._ixPair = cloc;
            cloc._ixPair = cloc2;
            locations.push( cloc );
          }
        }
      } else {
        // Subdivide both curves, and see if they intersect.
        var v1s = this.subdivide(v1),
          v2s = this.subdivide(v2);
        for (var i = 0; i < 2; i++)
          for (var j = 0; j < 2; j++)
            this.getIntersections(v1s[i], v2s[j], curve, curve2, locations);
      }
    }
    return locations;
  };