in packages/maker.js/src/core/combine.ts [45:109]
function breakAlongForeignPath(crossedPath: ICrossedPath, overlappedSegments: ICrossedPathSegment[], foreignWalkedPath: IWalkPath) {
var foreignPath = foreignWalkedPath.pathContext;
var segments = crossedPath.segments;
if (measure.isPathEqual(segments[0].absolutePath, foreignPath, .0001, null, foreignWalkedPath.offset)) {
segments[0].overlapped = true;
segments[0].duplicate = true;
overlappedSegments.push(segments[0]);
return;
}
//this will cache the slope, to keep from being recalculated for each segment
var popOptions: IIsPointOnPathOptions = {};
var options: IPathIntersectionOptions = { path1Offset: crossedPath.offset, path2Offset: foreignWalkedPath.offset };
var foreignIntersection = path.intersection(crossedPath.pathContext, foreignPath, options);
var intersectionPoints = foreignIntersection ? foreignIntersection.intersectionPoints : null;
var foreignPathEndPoints = point.fromPathEnds(foreignPath, foreignWalkedPath.offset) || [];
for (var i = 0; i < segments.length; i++) {
var pointsOfInterest = intersectionPoints ? foreignPathEndPoints.concat(intersectionPoints) : foreignPathEndPoints;
var pointsToCheck = getPointsOnPath(pointsOfInterest, segments[i].absolutePath, popOptions);
if (options.out_AreOverlapped) {
segments[i].overlapped = true;
overlappedSegments.push(segments[i]);
}
if (pointsToCheck.length > 0) {
//break the path which intersected, and add the shard to the end of the array so it can also be checked in this loop for further sharding.
var subSegments: IPath[] = null;
var p = 0;
while (!subSegments && p < pointsToCheck.length) {
subSegments = getNonZeroSegments(segments[i].absolutePath, pointsToCheck[p]);
p++;
}
if (subSegments) {
crossedPath.broken = true;
segments[i].absolutePath = subSegments[0];
if (subSegments[1]) {
var newSegment: ICrossedPathSegment = {
absolutePath: subSegments[1],
pathId: segments[0].pathId,
overlapped: segments[i].overlapped,
uniqueForeignIntersectionPoints: []
};
if (segments[i].overlapped) {
overlappedSegments.push(newSegment);
}
segments.push(newSegment);
}
//re-check this segment for another deep intersection
i--;
}
}
}
}