angular-sunburst-radar-chart
Version:
A Sunburst Radar chart with SVG,No Dependencies
60 lines • 14.1 kB
JavaScript
import { getLargeArcFlag, polarToCartesian } from './trignometry';
import { convertToPercentage } from './math';
import { createPathForBar } from './elements';
import { getItemTitle } from './utils';
export function createOuterChartBarWithInArc({ item, startAngle, endAngle, middleAngle, color, middleRadius, maxScore, innerRadiusBorder, center }) {
const [centerX, centerY] = [center.x, center.y];
const currentVal = item.value;
const totalRadiusInside = middleRadius - innerRadiusBorder;
const innerRadius = convertToPercentage({ plotMax: totalRadiusInside, actualScore: currentVal, maxScore });
const radiusFromCenter = innerRadius + innerRadiusBorder;
const firstPoint = polarToCartesian(centerX, centerY, radiusFromCenter, startAngle);
const secondPoint = polarToCartesian(centerX, centerY, radiusFromCenter, endAngle);
const startPoint = polarToCartesian(centerX, centerY, innerRadiusBorder, startAngle);
const endPoint = polarToCartesian(centerX, centerY, innerRadiusBorder, endAngle);
const startMiddlePoint = polarToCartesian(centerX, centerY, innerRadiusBorder, middleAngle);
const distFromStartToFirst = Math.sqrt(Math.pow((startPoint.x - firstPoint.x), 2) + Math.pow((startPoint.y - firstPoint.y), 2));
const distFromStartToSecond = Math.sqrt(Math.pow((startPoint.x - secondPoint.x), 2) + Math.pow((startPoint.y - secondPoint.y), 2));
const { updatedFirstPoint, updatedSecondPoint } = getUpdatedPoints(firstPoint, secondPoint, distFromStartToFirst, distFromStartToSecond);
const d = getDrawPositions(updatedFirstPoint, middleRadius, updatedSecondPoint, endPoint, startMiddlePoint, startPoint);
const title = getItemTitle(item);
return createPathForBar({ d: d.join(' '), stroke: 'none', fill: color, "fill-opacity": '0.5', title });
}
function getDrawPositions(firstPoint, middleRadius, secondPoint, endPoint, startMiddlePoint, startPoint) {
const d = [
'M', firstPoint.x, firstPoint.y,
'A', middleRadius, middleRadius, 0, 0, 1, secondPoint.x, secondPoint.y,
'L', endPoint.x, endPoint.y,
'C', endPoint.x, endPoint.y, startMiddlePoint.x, startMiddlePoint.y, startPoint.x, startPoint.y,
'L', firstPoint.x, firstPoint.y,
'Z'
];
return d;
}
export function getUpdatedPoints(firstPoint, secondPoint, distFromStartToFirst, distFromStartToSecond) {
let [updatedFirstPoint, updatedSecondPoint] = [firstPoint, secondPoint];
if (distFromStartToSecond < distFromStartToFirst) {
updatedSecondPoint = firstPoint;
updatedFirstPoint = secondPoint;
}
return { updatedSecondPoint, updatedFirstPoint };
}
export function createInnerChartBarWithInArc({ startPoint, item, radius, startAngle, endAngle, maxScore }) {
const [centerX, centerY] = [startPoint.x, startPoint.y];
const currentVal = item.value;
const color = item.color;
const arcRadius = convertToPercentage({ plotMax: radius, actualScore: currentVal, maxScore });
const start = polarToCartesian(centerX, centerY, arcRadius, endAngle);
const end = polarToCartesian(centerX, centerY, arcRadius, startAngle);
const largeArcFlag = getLargeArcFlag(startAngle, endAngle);
//const largeArcFlag = endAngle - startAngle <= 180 ? '0' : '1';
const d = [
'M', centerX, centerY,
'L', start.x, start.y,
'A', arcRadius, arcRadius, 0, largeArcFlag, 0, end.x, end.y
].join(' ');
const title = getItemTitle(item);
const arcForInnerChart = createPathForBar({ d, fill: color, title });
return arcForInnerChart;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjLWJhci1jaGFydHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXN1bmJ1cnN0LXJhZGFyLWNoYXJ0LyIsInNvdXJjZXMiOlsibGliL3V0aWxzL2FyYy1iYXItY2hhcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNDLE9BQU8sRUFBYSxnQkFBZ0IsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN4RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBR3JDLE1BQU0sVUFBVSw0QkFBNEIsQ0FBQyxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFDLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUM7SUFHN0ksTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBR2hELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7SUFHOUIsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLEdBQUcsaUJBQWlCLENBQUM7SUFFM0QsTUFBTSxXQUFXLEdBQUcsbUJBQW1CLENBQUMsRUFBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDO0lBQ3pHLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxHQUFHLGlCQUFpQixDQUFDO0lBR3pELE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDcEYsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxF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QUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUM1RCxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUdaLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUdqQyxNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztJQUVuRSxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2dldExhcmdlQXJjRmxhZywgcG9sYXJUb0NhcnRlc2lhbn0gZnJvbSAnLi90cmlnbm9tZXRyeSc7XHJcbmltcG9ydCB7Y29udmVydFRvUGVyY2VudGFnZX0gZnJvbSAnLi9tYXRoJztcclxuaW1wb3J0IHtjcmVhdGVQYXRoLCBjcmVhdGVQYXRoRm9yQmFyfSBmcm9tICcuL2VsZW1lbnRzJztcclxuaW1wb3J0IHtnZXRJdGVtVGl0bGV9IGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQge1BvaW50fSBmcm9tICcuL3Bvc2l0aW9ucyc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlT3V0ZXJDaGFydEJhcldpdGhJbkFyYyh7aXRlbSwgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIG1pZGRsZUFuZ2xlLCBjb2xvciwgbWlkZGxlUmFkaXVzLG1heFNjb3JlLCBpbm5lclJhZGl1c0JvcmRlciwgY2VudGVyfSkge1xyXG5cclxuXHJcbiAgY29uc3QgW2NlbnRlclgsIGNlbnRlclldID0gW2NlbnRlci54LCBjZW50ZXIueV07XHJcblxyXG5cclxuICBjb25zdCBjdXJyZW50VmFsID0gaXRlbS52YWx1ZTtcclxuXHJcblxyXG4gIGNvbnN0IHRvdGFsUmFkaXVzSW5zaWRlID0gbWlkZGxlUmFkaXVzIC0gaW5uZXJSYWRpdXNCb3JkZXI7XHJcblxyXG4gIGNvbnN0IGlubmVyUmFkaXVzID0gY29udmVydFRvUGVyY2VudGFnZSh7cGxvdE1heDogdG90YWxSYWRpdXNJbnNpZGUsIGFjdHVhbFNjb3JlOiBjdXJyZW50VmFsLCBtYXhTY29yZX0pO1xyXG4gIGNvbnN0IHJhZGl1c0Zyb21DZW50ZXIgPSBpbm5lclJhZGl1cyArIGlubmVyUmFkaXVzQm9yZGVyO1xyXG5cclxuXHJcbiAgY29uc3QgZmlyc3RQb2ludCA9IHBvbGFyVG9DYXJ0ZXNpYW4oY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzRnJvbUNlbnRlciwgc3RhcnRBbmdsZSk7XHJcbiAgY29uc3Qgc2Vjb25kUG9pbnQgPSBwb2xhclRvQ2FydGVzaWFuKGNlbnRlclgsIGNlbnRlclksIHJhZGl1c0Zyb21DZW50ZXIsIGVuZEFuZ2xlKTtcclxuXHJcblxyXG4gIGNvbnN0IHN0YXJ0UG9pbnQgPSBwb2xhclRvQ2FydGVzaWFuKGNlbnRlclgsIGNlbnRlclksIGlubmVyUmFkaXVzQm9yZGVyLCBzdGFydEFuZ2xlKTtcclxuICBjb25zdCBlbmRQb2ludCA9IHBvbGFyVG9DYXJ0ZXNpYW4oY2VudGVyWCwgY2VudGVyWSwgaW5uZXJSYWRpdXNCb3JkZXIsIGVuZEFuZ2xlKTtcclxuXHJcblxyXG4gIGNvbnN0IHN0YXJ0TWlkZGxlUG9pbnQgPSBwb2xhclRvQ2FydGVzaWFuKGNlbnRlclgsIGNlbnRlclksIGlubmVyUmFkaXVzQm9yZGVyLCBtaWRkbGVBbmdsZSk7XHJcblxyXG4gIGNvbnN0IGRpc3RGcm9tU3RhcnRUb0ZpcnN0ID0gTWF0aC5zcXJ0KE1hdGgucG93KChzdGFydFBvaW50LnggLSBmaXJzdFBvaW50LngpLCAyKSArIE1hdGgucG93KChzdGFydFBvaW50LnkgLSBmaXJzdFBvaW50LnkpLCAyKSk7XHJcbiAgY29uc3QgZGlzdEZyb21TdGFydFRvU2Vjb25kID0gTWF0aC5zcXJ0KE1hdGgucG93KChzdGFydFBvaW50LnggLSBzZWNvbmRQb2ludC54KSwgMikgKyBNYXRoLnBvdygoc3RhcnRQb2ludC55IC0gc2Vjb25kUG9pbnQueSksIDIpKTtcclxuXHJcblxyXG4gIGNvbnN0IHt1cGRhdGVkRmlyc3RQb2ludCwgdXBkYXRlZFNlY29uZFBvaW50fSA9IGdldFVwZGF0ZWRQb2ludHMoZmlyc3RQb2ludCwgc2Vjb25kUG9pbnQsIGRpc3RGcm9tU3RhcnRUb0ZpcnN0LCBkaXN0RnJvbVN0YXJ0VG9TZWNvbmQpO1xyXG5cclxuXHJcbiAgY29uc3QgZCA9IGdldERyYXdQb3NpdGlvbnModXBkYXRlZEZpcnN0UG9pbnQsIG1pZGRsZVJhZGl1cywgdXBkYXRlZFNlY29uZFBvaW50LCBlbmRQb2ludCwgc3RhcnRNaWRkbGVQb2ludCwgc3RhcnRQb2ludCk7XHJcblxyXG5cclxuICBjb25zdCB0aXRsZSA9IGdldEl0ZW1UaXRsZShpdGVtKTtcclxuXHJcbiAgcmV0dXJuIGNyZWF0ZVBhdGhGb3JCYXIoe2Q6IGQuam9pbignICcpLCBzdHJva2U6ICdub25lJywgZmlsbDogY29sb3IsXCJmaWxsLW9wYWNpdHlcIjonMC41JywgdGl0bGV9KTtcclxuXHJcbn1cclxuZnVuY3Rpb24gZ2V0RHJhd1Bvc2l0aW9ucyhmaXJzdFBvaW50OiB7IHg6IGFueTsgeTogYW55IH0sIG1pZGRsZVJhZGl1cywgc2Vjb25kUG9pbnQ6IHsgeDogYW55OyB5OiBhbnkgfSwgZW5kUG9pbnQ6IHsgeDogYW55OyB5OiBhbnkgfSwgc3RhcnRNaWRkbGVQb2ludDogeyB4OiBhbnk7IHk6IGFueSB9LCBzdGFydFBvaW50OiB7IHg6IGFueTsgeTogYW55IH0pIHtcclxuICBjb25zdCBkID0gW1xyXG5cclxuICAgICdNJywgZmlyc3RQb2ludC54LCBmaXJzdFBvaW50LnksXHJcbiAgICAnQScsIG1pZGRsZVJhZGl1cywgbWlkZGxlUmFkaXVzLCAwLCAwLCAxLCBzZWNvbmRQb2ludC54LCBzZWNvbmRQb2ludC55LFxyXG4gICAgJ0wnLCBlbmRQb2ludC54LCBlbmRQb2ludC55LFxyXG4gICAgJ0MnLCBlbmRQb2ludC54LCBlbmRQb2ludC55LCBzdGFydE1pZGRsZVBvaW50LngsIHN0YXJ0TWlkZGxlUG9pbnQueSwgc3RhcnRQb2ludC54LCBzdGFydFBvaW50LnksXHJcbiAgICAnTCcsIGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55LFxyXG4gICAgJ1onXHJcblxyXG5cclxuICBdO1xyXG4gIHJldHVybiBkO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVwZGF0ZWRQb2ludHMoZmlyc3RQb2ludDogUG9pbnQsIHNlY29uZFBvaW50OiBQb2ludCwgZGlzdEZyb21TdGFydFRvRmlyc3QsIGRpc3RGcm9tU3RhcnRUb1NlY29uZCkge1xyXG5cclxuICBsZXQgW3VwZGF0ZWRGaXJzdFBvaW50LCB1cGRhdGVkU2Vjb25kUG9pbnRdID0gW2ZpcnN0UG9pbnQsIHNlY29uZFBvaW50XTtcclxuXHJcbiAgaWYgKGRpc3RGcm9tU3RhcnRUb1NlY29uZCA8IGRpc3RGcm9tU3RhcnRUb0ZpcnN0KSB7XHJcbiAgICB1cGRhdGVkU2Vjb25kUG9pbnQgPSBmaXJzdFBvaW50O1xyXG4gICAgdXBkYXRlZEZpcnN0UG9pbnQgPSBzZWNvbmRQb2ludDtcclxuXHJcblxyXG4gIH1cclxuICByZXR1cm4ge3VwZGF0ZWRTZWNvbmRQb2ludCwgdXBkYXRlZEZpcnN0UG9pbnR9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5uZXJDaGFydEJhcldpdGhJbkFyYyh7c3RhcnRQb2ludCwgaXRlbSwgcmFkaXVzLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSxtYXhTY29yZX0pIHtcclxuXHJcbiAgY29uc3QgW2NlbnRlclgsIGNlbnRlclldID0gW3N0YXJ0UG9pbnQueCwgc3RhcnRQb2ludC55XTtcclxuXHJcbiAgY29uc3QgY3VycmVudFZhbCA9IGl0ZW0udmFsdWU7XHJcbiAgY29uc3QgY29sb3IgPSBpdGVtLmNvbG9yO1xyXG4gIGNvbnN0IGFyY1JhZGl1cyA9IGNvbnZlcnRUb1BlcmNlbnRhZ2Uoe3Bsb3RNYXg6IHJhZGl1cywgYWN0dWFsU2NvcmU6IGN1cnJlbnRWYWwsbWF4U2NvcmV9KTtcclxuXHJcblxyXG4gIGNvbnN0IHN0YXJ0ID0gcG9sYXJUb0NhcnRlc2lhbihjZW50ZXJYLCBjZW50ZXJZLCBhcmNSYWRpdXMsIGVuZEFuZ2xlKTtcclxuICBjb25zdCBlbmQgPSBwb2xhclRvQ2FydGVzaWFuKGNlbnRlclgsIGNlbnRlclksIGFyY1JhZGl1cywgc3RhcnRBbmdsZSk7XHJcblxyXG4gIGNvbnN0IGxhcmdlQXJjRmxhZyA9IGdldExhcmdlQXJjRmxhZyhzdGFydEFuZ2xlLGVuZEFuZ2xlKVxyXG4gIC8vY29uc3QgbGFyZ2VBcmNGbGFnID0gZW5kQW5nbGUgLSBzdGFydEFuZ2xlIDw9IDE4MCA/ICcwJyA6ICcxJztcclxuXHJcbiAgY29uc3QgZCA9IFtcclxuICAgICdNJywgY2VudGVyWCwgY2VudGVyWSxcclxuICAgICdMJywgc3RhcnQueCwgc3RhcnQueSxcclxuICAgICdBJywgYXJjUmFkaXVzLCBhcmNSYWRpdXMsIDAsIGxhcmdlQXJjRmxhZywgMCwgZW5kLngsIGVuZC55XHJcbiAgXS5qb2luKCcgJyk7XHJcblxyXG5cclxuICBjb25zdCB0aXRsZSA9IGdldEl0ZW1UaXRsZShpdGVtKTtcclxuXHJcblxyXG4gIGNvbnN0IGFyY0ZvcklubmVyQ2hhcnQgPSBjcmVhdGVQYXRoRm9yQmFyKHtkLCBmaWxsOiBjb2xvciwgdGl0bGV9KTtcclxuXHJcbiAgcmV0dXJuIGFyY0ZvcklubmVyQ2hhcnQ7XHJcbn1cclxuIl19