ngx-trend
Version:
ngx-trend Angular component
33 lines • 6.26 kB
JavaScript
import { checkForCollinearPoints, getDistanceBetween, moveTo, } from './math.helpers';
export const buildLinearPath = (data) => data.reduce((path, point, index) => {
// The very first instruction needs to be a "move".
// The rest will be a "line".
const isFirstInstruction = index === 0;
const instruction = isFirstInstruction ? 'M' : 'L';
return `${path}${instruction} ${point.x},${point.y}\n`;
}, '');
export function buildSmoothPath(data, radius) {
const [firstPoint, ...otherPoints] = data;
return otherPoints.reduce((path, point, index) => {
const next = otherPoints[index + 1];
const prev = otherPoints[index - 1] || firstPoint;
const isCollinear = next && checkForCollinearPoints(prev, point, next);
if (!next || isCollinear) {
// The very last line in the sequence can just be a regular line.
return `${path}\nL ${point.x},${point.y}`;
}
const distanceFromPrev = getDistanceBetween(prev, point);
const distanceFromNext = getDistanceBetween(next, point);
const threshold = Math.min(distanceFromPrev, distanceFromNext);
const isTooCloseForRadius = threshold / 2 < radius;
const radiusForPoint = isTooCloseForRadius ? threshold / 2 : radius;
const before = moveTo(prev, point, radiusForPoint);
const after = moveTo(next, point, radiusForPoint);
return [
path,
`L ${before.x},${before.y}`,
`S ${point.x},${point.y} ${after.x},${after.y}`,
].join('\n');
}, `M ${firstPoint.x},${firstPoint.y}`);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRE9NLmhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2hlbHBlcnMvRE9NLmhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixrQkFBa0IsRUFDbEIsTUFBTSxHQUVQLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsSUFBYSxFQUFFLEVBQUUsQ0FDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7SUFDakMsbURBQW1EO0lBQ25ELDZCQUE2QjtJQUM3QixNQUFNLGtCQUFrQixHQUFHLEtBQUssS0FBSyxDQUFDLENBQUM7SUFDdkMsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBRW5ELE9BQU8sR0FBRyxJQUFJLEdBQUcsV0FBVyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3pELENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVULE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBYSxFQUFFLE1BQWM7SUFDM0QsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUUxQyxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQy9DLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7UUFFbEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLHVCQUF1QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdkUsSUFBSSxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUU7WUFDeEIsaUVBQWlFO1lBQ2pFLE9BQU8sR0FBRyxJQUFJLE9BQU8sS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDM0M7UUFFRCxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFL0QsTUFBTSxtQkFBbUIsR0FBRyxTQUFTLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUVuRCxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBRXBFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRWxELE9BQU87WUFDTCxJQUFJO1lBQ0osS0FBSyxNQUFNLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLEVBQUU7WUFDM0IsS0FBSyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFO1NBQ2hELENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2YsQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY2hlY2tGb3JDb2xsaW5lYXJQb2ludHMsXG4gIGdldERpc3RhbmNlQmV0d2VlbixcbiAgbW92ZVRvLFxuICBQb2ludCxcbn0gZnJvbSAnLi9tYXRoLmhlbHBlcnMnO1xuXG5leHBvcnQgY29uc3QgYnVpbGRMaW5lYXJQYXRoID0gKGRhdGE6IFBvaW50W10pID0+XG4gIGRhdGEucmVkdWNlKChwYXRoLCBwb2ludCwgaW5kZXgpID0+IHtcbiAgICAvLyBUaGUgdmVyeSBmaXJzdCBpbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIFwibW92ZVwiLlxuICAgIC8vIFRoZSByZXN0IHdpbGwgYmUgYSBcImxpbmVcIi5cbiAgICBjb25zdCBpc0ZpcnN0SW5zdHJ1Y3Rpb24gPSBpbmRleCA9PT0gMDtcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGlzRmlyc3RJbnN0cnVjdGlvbiA/ICdNJyA6ICdMJztcblxuICAgIHJldHVybiBgJHtwYXRofSR7aW5zdHJ1Y3Rpb259ICR7cG9pbnQueH0sJHtwb2ludC55fVxcbmA7XG4gIH0sICcnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU21vb3RoUGF0aChkYXRhOiBQb2ludFtdLCByYWRpdXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IFtmaXJzdFBvaW50LCAuLi5vdGhlclBvaW50c10gPSBkYXRhO1xuXG4gIHJldHVybiBvdGhlclBvaW50cy5yZWR1Y2UoKHBhdGgsIHBvaW50LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBvdGhlclBvaW50c1tpbmRleCArIDFdO1xuICAgIGNvbnN0IHByZXYgPSBvdGhlclBvaW50c1tpbmRleCAtIDFdIHx8IGZpcnN0UG9pbnQ7XG5cbiAgICBjb25zdCBpc0NvbGxpbmVhciA9IG5leHQgJiYgY2hlY2tGb3JDb2xsaW5lYXJQb2ludHMocHJldiwgcG9pbnQsIG5leHQpO1xuXG4gICAgaWYgKCFuZXh0IHx8IGlzQ29sbGluZWFyKSB7XG4gICAgICAvLyBUaGUgdmVyeSBsYXN0IGxpbmUgaW4gdGhlIHNlcXVlbmNlIGNhbiBqdXN0IGJlIGEgcmVndWxhciBsaW5lLlxuICAgICAgcmV0dXJuIGAke3BhdGh9XFxuTCAke3BvaW50Lnh9LCR7cG9pbnQueX1gO1xuICAgIH1cblxuICAgIGNvbnN0IGRpc3RhbmNlRnJvbVByZXYgPSBnZXREaXN0YW5jZUJldHdlZW4ocHJldiwgcG9pbnQpO1xuICAgIGNvbnN0IGRpc3RhbmNlRnJvbU5leHQgPSBnZXREaXN0YW5jZUJldHdlZW4obmV4dCwgcG9pbnQpO1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IE1hdGgubWluKGRpc3RhbmNlRnJvbVByZXYsIGRpc3RhbmNlRnJvbU5leHQpO1xuXG4gICAgY29uc3QgaXNUb29DbG9zZUZvclJhZGl1cyA9IHRocmVzaG9sZCAvIDIgPCByYWRpdXM7XG5cbiAgICBjb25zdCByYWRpdXNGb3JQb2ludCA9IGlzVG9vQ2xvc2VGb3JSYWRpdXMgPyB0aHJlc2hvbGQgLyAyIDogcmFkaXVzO1xuXG4gICAgY29uc3QgYmVmb3JlID0gbW92ZVRvKHByZXYsIHBvaW50LCByYWRpdXNGb3JQb2ludCk7XG4gICAgY29uc3QgYWZ0ZXIgPSBtb3ZlVG8obmV4dCwgcG9pbnQsIHJhZGl1c0ZvclBvaW50KTtcblxuICAgIHJldHVybiBbXG4gICAgICBwYXRoLFxuICAgICAgYEwgJHtiZWZvcmUueH0sJHtiZWZvcmUueX1gLFxuICAgICAgYFMgJHtwb2ludC54fSwke3BvaW50Lnl9ICR7YWZ0ZXIueH0sJHthZnRlci55fWAsXG4gICAgXS5qb2luKCdcXG4nKTtcbiAgfSwgYE0gJHtmaXJzdFBvaW50Lnh9LCR7Zmlyc3RQb2ludC55fWApO1xufVxuIl19