UNPKG

vuetify

Version:

Vue Material Component Framework

73 lines (69 loc) 3.15 kB
/* * Credits: Alexander Milevski https://github.com/w8r/svg-arc-corners */ function pointOnArc(center, radius, angle) { const radians = (angle - 90) * Math.PI / 180.0; return [center[0] + radius * Math.cos(radians), center[1] + radius * Math.sin(radians)]; } function drawCircle(_ref, r, width) { let [x, y] = _ref; const innerRadius = r - width; return ['M', x - r, y, 'A', r, r, 0, 1, 0, x + r, y, 'A', r, r, 0, 1, 0, x - r, y, 'M', x - innerRadius, y, 'A', innerRadius, innerRadius, 0, 1, 0, x + innerRadius, y, 'A', innerRadius, innerRadius, 0, 1, 0, x - innerRadius, y, 'Z']; } export function simpleArc(center, r, startAngle, endAngle) { const start = pointOnArc(center, r, startAngle); const end = pointOnArc(center, r, endAngle); const sweep = endAngle - startAngle > 180 ? 1 : 0; return [`M${start[0]} ${start[1]}`, `A${r} ${r} 0 ${sweep} 1 ${end[0]} ${end[1]}`, `L${center[0]} ${center[1]}Z`].join(' '); } export function roundedArc(center, radius, startAngle, endAngle, width, rounding) { width = Math.min(radius, width); if (Math.abs(endAngle - startAngle) === 360) { return drawCircle(center, radius, width).join(' '); } if (rounding === 0 && radius === width) { return simpleArc(center, radius, startAngle, endAngle); } const innerR = radius - width; const circumference = Math.abs(endAngle - startAngle); rounding = Math.min(width / 2, rounding); if (360 * (rounding / (Math.PI * (radius - width))) > Math.abs(startAngle - endAngle)) { rounding = circumference / 360 * innerR * Math.PI; } // inner and outer radiuses const innerR2 = innerR + rounding; const outerRadius = radius - rounding; // butts corner points const oStart = pointOnArc(center, outerRadius, startAngle); const oEnd = pointOnArc(center, outerRadius, endAngle); const iStart = pointOnArc(center, innerR2, startAngle); const iEnd = pointOnArc(center, innerR2, endAngle); const iSection = innerR ? 360 * (rounding / (2 * Math.PI * innerR)) : 0; const oSection = 360 * (rounding / (2 * Math.PI * radius)); // arcs endpoints const iArcStart = pointOnArc(center, innerR, startAngle + iSection); const iArcEnd = pointOnArc(center, innerR, endAngle - iSection); const oArcStart = pointOnArc(center, radius, startAngle + oSection); const oArcEnd = pointOnArc(center, radius, endAngle - oSection); const arcSweep1 = circumference > 180 + 2 * oSection ? 1 : 0; const arcSweep2 = circumference > 180 + 2 * iSection ? 1 : 0; return [ // begin path 'M', oStart[0], oStart[1], // outer start corner 'A', rounding, rounding, 0, 0, 1, oArcStart[0], oArcStart[1], // outer main arc 'A', radius, radius, 0, arcSweep1, 1, oArcEnd[0], oArcEnd[1], // outer end corner 'A', rounding, rounding, 0, 0, 1, oEnd[0], oEnd[1], // end butt 'L', iEnd[0], iEnd[1], // inner end corner 'A', rounding, rounding, 0, 0, 1, iArcEnd[0], iArcEnd[1], // inner arc 'A', innerR, innerR, 0, arcSweep2, 0, iArcStart[0], iArcStart[1], // inner start corner 'A', rounding, rounding, 0, 0, 1, iStart[0], iStart[1], 'Z' // end path ].join(' '); } //# sourceMappingURL=svg-arc-corners.js.map