return joint.sort(function (p0, p1) { // 如果交点需要不相等,则按小到大排序 if (p0.index !== p1.index) { return p0.index - p1.index; } // 相等,则同一段上有多个交点,按照与原点距离排序 var cur = path[p0.index]; var next = p0.index === length - 1 ? path[0] : path[p0.index + 1]; // 直线 if (cur.onCurve && next.onCurve) { return Math.pow(p0.x - cur.x, 2) + Math.pow(p0.y - cur.y, 2) - (Math.pow(p1.x - cur.x, 2) + Math.pow(p1.y - cur.y, 2)); } else if (!cur.onCurve) { var prev = p0.index === 0 ? path[length - 1] : path[p0.index - 1]; var t1 = getBezierQ2T(prev, cur, next, p0); var t2 = getBezierQ2T(prev, cur, next, p1); return t1 === t2 ? 0 : t1 < t2 ? -1 : 1; } });
pathIterator(path, function (c, p0, p1, p2, i) { if (c === 'L') { if (Math.abs((p.y - p0.y) * (p.x - p1.x) - (p.y - p1.y) * (p.x - p0.x)) <= 0.001) { zCount = i; return false; } } else if(c === 'Q') { if (false !== getBezierQ2T(p0, p1, p2, p)) { zCount = i; return false; } } });