in packages/maker.js/src/core/fillet.ts [308:364]
export function dogbone(lineA: IPathLine, lineB: IPathLine, filletRadius: number, options?: IPointMatchOptions): IPathArc {
//TODO: allow arcs in dogbone
if (isPathLine(lineA) && isPathLine(lineB) && filletRadius && filletRadius > 0) {
var opts: IPointMatchOptions = {
pointMatchingDistance: .005
};
extendObject(opts, options);
//first find the common point
var commonProperty = getMatchingPointProperties(lineA, lineB, options);
if (commonProperty) {
//get the ratio comparison of the two lines
var ratio = getLineRatio([lineA, lineB]);
//draw a line between the two endpoints, and get the bisection point at the ratio
var span = new paths.Line(commonProperty[0].oppositePoint, commonProperty[1].oppositePoint);
var midRatioPoint = point.middle(span, ratio);
//use the bisection theorem to get the angle bisecting the lines
var bisectionAngle = angle.ofPointInDegrees(commonProperty[0].point, midRatioPoint);
var center = point.add(commonProperty[0].point, point.fromPolar(angle.toRadians(bisectionAngle), filletRadius));
if (!populateShardPointsFromReferenceCircle(filletRadius, center, commonProperty, opts)) {
return null;
}
//get the angles of the fillet and a function which clips the path to the fillet.
var results: IFilletResult[] = [];
for (var i = 0; i < 2; i++) {
var result = getDogboneResult(commonProperty[i], center);
if (!result) {
return null;
}
results.push(result);
}
var filletArc = new paths.Arc(center, filletRadius, results[0].filletAngle, results[1].filletAngle);
//make sure midpoint of fillet is outside of the angle
if (round(angle.noRevolutions(angle.ofArcMiddle(filletArc))) == round(bisectionAngle)) {
filletArc.startAngle = results[1].filletAngle;
filletArc.endAngle = results[0].filletAngle;
}
//clip the paths and return the fillet arc.
results[0].clipPath();
results[1].clipPath();
return filletArc;
}
}
return null;
}