UNPKG

@vx/shape

Version:
63 lines (55 loc) 2.18 kB
import memoize from 'lodash/memoize'; var MEASUREMENT_ELEMENT_ID = '__vx_splitpath_svg_path_measurement_id'; var SVG_NAMESPACE_URL = 'http://www.w3.org/2000/svg'; export function getSplitLineSegments(_ref) { var path = _ref.path, segments = _ref.segments, _ref$sampleRate = _ref.sampleRate, sampleRate = _ref$sampleRate === void 0 ? 0.25 : _ref$sampleRate; try { var pathElement = document.getElementById(MEASUREMENT_ELEMENT_ID); // create a single path element if not done already if (!pathElement) { var svg = document.createElementNS(SVG_NAMESPACE_URL, 'svg'); // not visible svg.style.opacity = '0'; svg.style.width = '0'; svg.style.height = '0'; // off screen svg.style.position = 'absolute'; svg.style.top = '-100%'; svg.style.left = '-100%'; // no mouse events svg.style.pointerEvents = 'none'; pathElement = document.createElementNS(SVG_NAMESPACE_URL, 'path'); pathElement.setAttribute('id', MEASUREMENT_ELEMENT_ID); svg.appendChild(pathElement); document.body.appendChild(svg); } pathElement.setAttribute('d', path); var totalPathLength = pathElement.getTotalLength(); var totalPieces = segments.reduce(function (sum, curr) { return sum + curr.length; }, 0); var pieceSize = totalPathLength / totalPieces; var cumulativeSize = 0; var lineSegments = segments.map(function (segment) { var segmentPointCount = segment.length; var coords = []; for (var i = 0; i < segmentPointCount + sampleRate; i += sampleRate) { var distance = (cumulativeSize + i) * pieceSize; var point = pathElement.getPointAtLength(distance); coords.push(point); } cumulativeSize += segmentPointCount; return coords; }); return lineSegments; } catch (e) { return []; } } export default memoize(getSplitLineSegments, function (_ref2) { var path = _ref2.path, segments = _ref2.segments, sampleRate = _ref2.sampleRate; return path + "_" + segments.length + "_" + segments.map(function (segment) { return segment.length; }).join('-') + "_" + sampleRate; });