angular-sunburst-radar-chart
Version:
A Sunburst Radar chart with SVG,No Dependencies
63 lines • 10.6 kB
JavaScript
import { polarToCartesian } from './trignometry';
function getRadiusForBorderAndText(radius, borderHeight) {
const borderRadius = radius + borderHeight;
const textRadius = radius + ((borderRadius - radius) / 2);
return [borderRadius, textRadius];
}
export function getMaxDepth(items, currentLevel = 0) {
let depths = [];
if (items && items.length > 0) {
const nextLevel = currentLevel + 1;
depths = items
.filter(item => !!item.children)
.filter(item => item.children.length > 0)
.map(item => getMaxDepth(item.children, nextLevel));
}
return depths.length !== 0 ? Math.max(...depths) : currentLevel;
}
export function getGlobalPositions({ size, maxScore, items }) {
const center = { x: size / 2, y: size / 2 };
const maxDepth = getMaxDepth(items);
const totalLevels = maxDepth + 1;
const innerCircleRadius = Math.abs(size / 5.33);
const totalRadiusToBeDrawn = 2 * Math.abs(size / 5.33);
const borderHeight = 0.0375 * size;
const everyLevelRadius = totalRadiusToBeDrawn / totalLevels;
const levels = [];
for (let i = 1; i <= totalLevels; i++) {
const startRadius = i * everyLevelRadius;
const [endRadius, textRadius] = getRadiusForBorderAndText(startRadius, borderHeight);
levels.push({ startRadius, endRadius, textRadius });
}
const innerRadius = innerCircleRadius;
const [innerRadiusBorder, innerTextRadius] = getRadiusForBorderAndText(innerRadius, borderHeight);
const middleRadius = innerCircleRadius * 2;
const [middleRadiusBorder, middleTextRadius] = getRadiusForBorderAndText(middleRadius, borderHeight);
const outerRadius = middleRadius + borderHeight;
const [outerRadiusBorder, outerTextRadius] = getRadiusForBorderAndText(outerRadius, borderHeight * 2);
const textSize = 0.0175 * size;
const outerTextSize = 0.0225 * size;
const result = {
textSize,
outerTextSize,
levels,
innerRadius,
innerRadiusBorder,
innerTextRadius,
middleRadius,
middleTextRadius,
middleRadiusBorder,
outerRadius,
outerRadiusBorder,
outerTextRadius,
center
};
return result;
}
export function calculatePointBetween({ centerX, centerY, startAngle, middleAngle, endAngle, radius }) {
const start = polarToCartesian(centerX, centerY, radius, startAngle);
const middle = polarToCartesian(centerX, centerY, radius, middleAngle);
const end = polarToCartesian(centerX, centerY, radius, endAngle);
return { start, middle, end };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zaXRpb25zLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1zdW5idXJzdC1yYWRhci1jaGFydC8iLCJzb3VyY2VzIjpbImxpYi91dGlscy9wb3NpdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBdUIvQyxTQUFTLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxZQUFZO0lBQ3JELE1BQU0sWUFBWSxHQUFHLE1BQU0sR0FBRyxZQUFZLENBQUM7SUFDM0MsTUFBTSxVQUFVLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFMUQsT0FBTyxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztBQUVwQyxDQUFDO0FBR0QsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFLLEVBQUUsWUFBWSxHQUFHLENBQUM7SUFFakQsSUFBSSxNQUFNLEdBQUMsRUFBRSxDQUFDO0lBQ2QsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDN0IsTUFBTSxTQUFTLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLEdBQUcsS0FBSzthQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUN4QyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0tBR3ZEO0lBRUQsT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFH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QUVqRSxPQUFPLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUMsQ0FBQztBQUU5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtwb2xhclRvQ2FydGVzaWFufSBmcm9tICcuL3RyaWdub21ldHJ5JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUG9pbnQge1xyXG4gIHg6IG51bWJlcjtcclxuICB5OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR2xvYmFsUG9zaXRpb24ge1xyXG4gIGlubmVyUmFkaXVzO1xyXG4gIGlubmVyUmFkaXVzQm9yZGVyO1xyXG4gIGlubmVyVGV4dFJhZGl1cztcclxuICBtaWRkbGVSYWRpdXM7XHJcbiAgbWlkZGxlVGV4dFJhZGl1cztcclxuICBtaWRkbGVSYWRpdXNCb3JkZXI7XHJcbiAgb3V0ZXJSYWRpdXM7XHJcbiAgb3V0ZXJSYWRpdXNCb3JkZXI7XHJcbiAgb3V0ZXJUZXh0UmFkaXVzO1xyXG4gIHRleHRTaXplO1xyXG4gIG91dGVyVGV4dFNpemU7XHJcbiAgbGV2ZWxzO1xyXG4gIGNlbnRlcjogUG9pbnQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFJhZGl1c0ZvckJvcmRlckFuZFRleHQocmFkaXVzLCBib3JkZXJIZWlnaHQpIHtcclxuICBjb25zdCBib3JkZXJSYWRpdXMgPSByYWRpdXMgKyBib3JkZXJIZWlnaHQ7XHJcbiAgY29uc3QgdGV4dFJhZGl1cyA9IHJhZGl1cyArICgoYm9yZGVyUmFkaXVzIC0gcmFkaXVzKSAvIDIpO1xyXG5cclxuICByZXR1cm4gW2JvcmRlclJhZGl1cywgdGV4dFJhZGl1c107XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldE1heERlcHRoKGl0ZW1zLCBjdXJyZW50TGV2ZWwgPSAwKSB7XHJcblxyXG4gIGxldCBkZXB0aHM9W107XHJcbiAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgIGNvbnN0IG5leHRMZXZlbCA9IGN1cnJlbnRMZXZlbCArIDE7XHJcbiAgICBkZXB0aHMgPSBpdGVtc1xyXG4gICAgICAuZmlsdGVyKGl0ZW0gPT4gISFpdGVtLmNoaWxkcmVuKVxyXG4gICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwKVxyXG4gICAgICAubWFwKGl0ZW0gPT4gZ2V0TWF4RGVwdGgoaXRlbS5jaGlsZHJlbiwgbmV4dExldmVsKSk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIHJldHVybiBkZXB0aHMubGVuZ3RoICE9PSAwID8gTWF0aC5tYXgoLi4uZGVwdGhzKSA6IGN1cnJlbnRMZXZlbDtcclxuXHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsUG9zaXRpb25zKHtzaXplLCBtYXhTY29yZSwgaXRlbXN9KSB7XHJcblxyXG5cclxuICBjb25zdCBjZW50ZXI6IFBvaW50ID0ge3g6IHNpemUgLyAyLCB5OiBzaXplIC8gMn07XHJcbiAgY29uc3QgbWF4RGVwdGggPSBnZXRNYXhEZXB0aChpdGVtcyk7XHJcblxyXG4gIGNvbnN0IHRvdGFsTGV2ZWxzID0gbWF4RGVwdGggKyAxO1xyXG5cclxuICBjb25zdCBpbm5lckNpcmNsZVJhZGl1cyA9IE1hdGguYWJzKHNpemUgLyA1LjMzKTtcclxuXHJcblxyXG4gIGNvbnN0IHRvdGFsUmFkaXVzVG9CZURyYXduID0gMiAqIE1hdGguYWJzKHNpemUgLyA1LjMzKTtcclxuICBjb25zdCBib3JkZXJIZWlnaHQgPSAwLjAzNzUgKiBzaXplO1xyXG5cclxuICBjb25zdCBldmVyeUxldmVsUmFkaXVzID0gdG90YWxSYWRpdXNUb0JlRHJhd24gLyB0b3RhbExldmVscztcclxuXHJcbiAgY29uc3QgbGV2ZWxzID0gW107XHJcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdG90YWxMZXZlbHM7IGkrKykge1xyXG5cclxuICAgIGNvbnN0IHN0YXJ0UmFkaXVzID0gaSAqIGV2ZXJ5TGV2ZWxSYWRpdXM7XHJcbiAgICBjb25zdCBbZW5kUmFkaXVzLCB0ZXh0UmFkaXVzXSA9IGdldFJhZGl1c0ZvckJvcmRlckFuZFRleHQoc3RhcnRSYWRpdXMsIGJvcmRlckhlaWdodCk7XHJcbiAgICBsZXZlbHMucHVzaCh7c3RhcnRSYWRpdXMsIGVuZFJhZGl1cywgdGV4dFJhZGl1c30pO1xyXG5cclxuXHJcbiAgfVxyXG4gIGNvbnN0IGlubmVyUmFkaXVzID0gaW5uZXJDaXJjbGVSYWRpdXM7XHJcbiAgY29uc3QgW2lubmVyUmFkaXVzQm9yZGVyLCBpbm5lclRleHRSYWRpdXNdID0gZ2V0UmFkaXVzRm9yQm9yZGVyQW5kVGV4dChpbm5lclJhZGl1cywgYm9yZGVySGVpZ2h0KTtcclxuXHJcbiAgY29uc3QgbWlkZGxlUmFkaXVzID0gaW5uZXJDaXJjbGVSYWRpdXMgKiAyO1xyXG4gIGNvbnN0IFttaWRkbGVSYWRpdXNCb3JkZXIsIG1pZGRsZVRleHRSYWRpdXNdID0gZ2V0UmFkaXVzRm9yQm9yZGVyQW5kVGV4dChtaWRkbGVSYWRpdXMsIGJvcmRlckhlaWdodCk7XHJcblxyXG4gIGNvbnN0IG91dGVyUmFkaXVzID0gbWlkZGxlUmFkaXVzICsgYm9yZGVySGVpZ2h0O1xyXG4gIGNvbnN0IFtvdXRlclJhZGl1c0JvcmRlciwgb3V0ZXJUZXh0UmFkaXVzXSA9IGdldFJhZGl1c0ZvckJvcmRlckFuZFRleHQob3V0ZXJSYWRpdXMsIGJvcmRlckhlaWdodCAqIDIpO1xyXG5cclxuICBjb25zdCB0ZXh0U2l6ZSA9IDAuMDE3NSAqIHNpemU7XHJcbiAgY29uc3Qgb3V0ZXJUZXh0U2l6ZSA9IDAuMDIyNSAqIHNpemU7XHJcblxyXG4gIGNvbnN0IHJlc3VsdCA9IHtcclxuICAgIHRleHRTaXplLFxyXG4gICAgb3V0ZXJUZXh0U2l6ZSxcclxuICAgIGxldmVscyxcclxuICAgIGlubmVyUmFkaXVzLFxyXG4gICAgaW5uZXJSYWRpdXNCb3JkZXIsXHJcbiAgICBpbm5lclRleHRSYWRpdXMsXHJcbiAgICBtaWRkbGVSYWRpdXMsXHJcbiAgICBtaWRkbGVUZXh0UmFkaXVzLFxyXG4gICAgbWlkZGxlUmFkaXVzQm9yZGVyLFxyXG4gICAgb3V0ZXJSYWRpdXMsXHJcbiAgICBvdXRlclJhZGl1c0JvcmRlcixcclxuICAgIG91dGVyVGV4dFJhZGl1cyxcclxuICAgIGNlbnRlclxyXG4gIH07XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlUG9pbnRCZXR3ZWVuKHtjZW50ZXJYLCBjZW50ZXJZLCBzdGFydEFuZ2xlLCBtaWRkbGVBbmdsZSwgZW5kQW5nbGUsIHJhZGl1c30pIHtcclxuXHJcblxyXG5cclxuICBjb25zdCBzdGFydCA9IHBvbGFyVG9DYXJ0ZXNpYW4oY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBzdGFydEFuZ2xlKTtcclxuICBjb25zdCBtaWRkbGUgPSBwb2xhclRvQ2FydGVzaWFuKGNlbnRlclgsIGNlbnRlclksIHJhZGl1cywgbWlkZGxlQW5nbGUpO1xyXG4gIGNvbnN0IGVuZCA9IHBvbGFyVG9DYXJ0ZXNpYW4oY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBlbmRBbmdsZSk7XHJcblxyXG4gIHJldHVybiB7c3RhcnQsIG1pZGRsZSwgZW5kfTtcclxuXHJcbn1cclxuIl19