UNPKG

angular-sunburst-radar-chart

Version:
118 lines 18.4 kB
//Not Used now ,Might Use later import { polarToCartesian } from './trignometry'; // function anglesBasedOnPercentage(items) { // // const total = items.reduce((prevValue, curValue) => prevValue + //curValue, 0); // if (Math.round(total) != 100) { // console.error('Cannnot draw as the sum of values should be 100'); // throw new Error('Cannnot draw as the sum of values should be 100'); // } // let prevDegree = 0; // const results = []; // for (let i = 0; i < items.length; i++) { // // const item = items[i]; // const currentDegree = item * 3.6; // // const degreeToBeDrawn = currentDegree + prevDegree; // results.push(degreeToBeDrawn); // prevDegree = prevDegree + currentDegree; // } // // // return results; // } // function getInitialPosition(startLocation, totalDegrees, num) { const perLocation = totalDegrees / num; const middleLocation = perLocation / 2; const startMiddle = startLocation + middleLocation; return { startLocation, perLocation, middleLocation, startMiddle }; } function getDegreeForIndexBasedOnSplitAngle(index, data) { const { perLocation, middleLocation, startMiddle, startLocation } = data; let position = index; // + 1; const startDegree = startLocation + (position * perLocation); const middleDegree = startMiddle + (position * perLocation); const endDegree = startLocation + (position * perLocation) + perLocation; return { startDegree, middleDegree, endDegree }; } export function getAllAnglesBasedOnChild(items) { const num = items.length; const results = []; const totalChildren = items.filter(item => item.children).map(item => item.children.length).reduce(((a, b) => a + b), 0); const childAngleDifference = 360 / totalChildren; let currentStartLocation = 0; for (let i = 0; i < items.length; i++) { const item = items[i]; const childCount = item.children ? item.children.length : 0; const totalDegrees = childCount * childAngleDifference; const endDegree = currentStartLocation + (childCount * childAngleDifference); const middleDegree = (endDegree - currentStartLocation) / 2; const currentItem = {}; currentItem['item'] = item; currentItem['startDegree'] = currentStartLocation; currentItem['middleDegree'] = middleDegree; currentItem['endDegree'] = endDegree; if (childCount > 0) { currentItem['children'] = iterateChildrenAndSetAngles({ children: item.children, currentItem, angleDifference: totalDegrees }); } currentStartLocation = currentStartLocation + (childCount * childAngleDifference); results.push(currentItem); } return results; } export function getAllAnglesBasedOnParent(items) { const num = items.length; let results = []; let angleDifference = 360 / num; const data = getInitialPosition(0, 360, num); for (let i = 0; i < items.length; i++) { const { startDegree, middleDegree, endDegree } = getDegreeForIndexBasedOnSplitAngle(i, data); const item = items[i]; const currentItem = {}; currentItem['item'] = item; currentItem['startDegree'] = startDegree; currentItem['middleDegree'] = middleDegree; currentItem['endDegree'] = endDegree; const hasChildren = items.filter(item => !!item.children).length > 0; if (hasChildren) { currentItem['children'] = iterateChildrenAndSetAngles({ children: item.children, currentItem, angleDifference }); } results.push(currentItem); } return results; } function iterateChildrenAndSetAngles({ children, currentItem, angleDifference }) { const count = children.length; const childItems = []; const data = getInitialPosition(currentItem['startDegree'], angleDifference, count); for (let j = 0; j < count; j++) { const childItem = {}; childItem['item'] = children[j]; const { startDegree, middleDegree, endDegree } = getDegreeForIndexBasedOnSplitAngle(j, data); childItem['startDegree'] = startDegree; childItem['middleDegree'] = middleDegree; childItem['endDegree'] = endDegree; childItems.push(childItem); } return childItems; } export function positionsOnAngles(centerX, centerY, radius, angels) { const results = []; for (let i = 0; i < angels.length; i++) { const degreeToBeDrawn = angels[i]; results.push(polarToCartesian(centerX, centerY, radius, degreeToBeDrawn)); } return results; } export function getPointsOnCircleAtAngels(centerX, centerY, radius, angels) { const results = []; for (let i = 0; i < angels.length; i++) { const degreeToBeDrawn = angels[i]; results.push(polarToCartesian(centerX, centerY, radius, degreeToBeDrawn)); } return results; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5nZWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1zdW5idXJzdC1yYWRhci1jaGFydC8iLCJzb3VyY2VzIjpbImxpYi91dGlscy9hbmdlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUUvQyw0Q0FBNEM7QUFDNUMsRUFBRTtBQUNGLG9FQUFvRTtBQUNwRSxlQUFlO0FBQ2Ysb0NBQW9DO0FBQ3BDLHdFQUF3RTtBQUN4RSwwRUFBMEU7QUFDMUUsTUFBTTtBQUNOLHdCQUF3QjtBQUN4Qix3QkFBd0I7QUFDeEIsNkNBQTZDO0FBQzdDLEVBQUU7QUFDRiw2QkFBNkI7QUFDN0Isd0NBQXdDO0FBQ3hDLEVBQUU7QUFDRiwwREFBMEQ7QUFDMUQscUNBQXFDO0FBQ3JDLCtDQUErQztBQUMvQyxNQUFNO0FBQ04sRUFBRTtBQUNGLEVBQUU7QUFDRixvQkFBb0I7QUFDcEIsSUFBSTtBQUNKLEVBQUU7QUFFRixTQUFTLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsR0FBRztJQUcxRCxNQUFNLFdBQVcsR0FBRyxZQUFZLEdBQUcsR0FBRyxDQUFDO0lBQ3ZDLE1BQU0sY0FBYyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDdkMsTUFBTSxXQUFXLEdBQUcsYUFBYSxHQUFHLGNBQWMsQ0FBQztJQUVuRCxPQUFPLEVBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFDLENBQUM7QUFHbkUsQ0FBQztBQUVELFNBQVMsa0NBQWtDLENBQUMsS0FBSyxFQUFFLElBQUk7SUFHckQsTUFBTSxFQUFDLFdBQVcsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBQyxHQUFHLElBQUksQ0FBQztJQUN2RSxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQSxPQUFPO0lBRzVCLE1BQU0sV0FBVyxHQUFHLGFBQWEsR0FBRyxD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QyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUV0QyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO0tBRTNFO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vTm90IFVzZWQgbm93ICxNaWdodCBVc2UgbGF0ZXJcclxuaW1wb3J0IHtwb2xhclRvQ2FydGVzaWFufSBmcm9tICcuL3RyaWdub21ldHJ5JztcclxuXHJcbi8vIGZ1bmN0aW9uIGFuZ2xlc0Jhc2VkT25QZXJjZW50YWdlKGl0ZW1zKSB7XHJcbi8vXHJcbi8vICAgY29uc3QgdG90YWwgPSBpdGVtcy5yZWR1Y2UoKHByZXZWYWx1ZSwgY3VyVmFsdWUpID0+IHByZXZWYWx1ZSArXHJcbi8vY3VyVmFsdWUsIDApO1xyXG4vLyAgIGlmIChNYXRoLnJvdW5kKHRvdGFsKSAhPSAxMDApIHtcclxuLy8gICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5ub3QgZHJhdyBhcyB0aGUgc3VtIG9mIHZhbHVlcyBzaG91bGQgYmUgMTAwJyk7XHJcbi8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5ub3QgZHJhdyBhcyB0aGUgc3VtIG9mIHZhbHVlcyBzaG91bGQgYmUgMTAwJyk7XHJcbi8vICAgfVxyXG4vLyAgIGxldCBwcmV2RGVncmVlID0gMDtcclxuLy8gICBjb25zdCByZXN1bHRzID0gW107XHJcbi8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4vL1xyXG4vLyAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldO1xyXG4vLyAgICAgY29uc3QgY3VycmVudERlZ3JlZSA9IGl0ZW0gKiAzLjY7XHJcbi8vXHJcbi8vICAgICBjb25zdCBkZWdyZWVUb0JlRHJhd24gPSBjdXJyZW50RGVncmVlICsgcHJldkRlZ3JlZTtcclxuLy8gICAgIHJlc3VsdHMucHVzaChkZWdyZWVUb0JlRHJhd24pO1xyXG4vLyAgICAgcHJldkRlZ3JlZSA9IHByZXZEZWdyZWUgKyBjdXJyZW50RGVncmVlO1xyXG4vLyAgIH1cclxuLy9cclxuLy9cclxuLy8gICByZXR1cm4gcmVzdWx0cztcclxuLy8gfVxyXG4vL1xyXG5cclxuZnVuY3Rpb24gZ2V0SW5pdGlhbFBvc2l0aW9uKHN0YXJ0TG9jYXRpb24sIHRvdGFsRGVncmVlcywgbnVtKSB7XHJcblxyXG5cclxuICBjb25zdCBwZXJMb2NhdGlvbiA9IHRvdGFsRGVncmVlcyAvIG51bTtcclxuICBjb25zdCBtaWRkbGVMb2NhdGlvbiA9IHBlckxvY2F0aW9uIC8gMjtcclxuICBjb25zdCBzdGFydE1pZGRsZSA9IHN0YXJ0TG9jYXRpb24gKyBtaWRkbGVMb2NhdGlvbjtcclxuXHJcbiAgcmV0dXJuIHtzdGFydExvY2F0aW9uLCBwZXJMb2NhdGlvbiwgbWlkZGxlTG9jYXRpb24sIHN0YXJ0TWlkZGxlfTtcclxuXHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXREZWdyZWVGb3JJbmRleEJhc2VkT25TcGxpdEFuZ2xlKGluZGV4LCBkYXRhKSB7XHJcblxyXG5cclxuICBjb25zdCB7cGVyTG9jYXRpb24sIG1pZGRsZUxvY2F0aW9uLCBzdGFydE1pZGRsZSwgc3RhcnRMb2NhdGlvbn0gPSBkYXRhO1xyXG4gIGxldCBwb3NpdGlvbiA9IGluZGV4Oy8vICsgMTtcclxuXHJcblxyXG4gIGNvbnN0IHN0YXJ0RGVncmVlID0gc3RhcnRMb2NhdGlvbiArIChwb3NpdGlvbiAqIHBlckxvY2F0aW9uKTtcclxuICBjb25zdCBtaWRkbGVEZWdyZWUgPSBzdGFydE1pZGRsZSArIChwb3NpdGlvbiAqIHBlckxvY2F0aW9uKTtcclxuICBjb25zdCBlbmREZWdyZWUgPSBzdGFydExvY2F0aW9uICsgKHBvc2l0aW9uICogcGVyTG9jYXRpb24pICsgcGVyTG9jYXRpb247XHJcblxyXG5cclxuICByZXR1cm4ge3N0YXJ0RGVncmVlLCBtaWRkbGVEZWdyZWUsIGVuZERlZ3JlZX07XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsQW5nbGVzQmFzZWRPbkNoaWxkKGl0ZW1zKSB7XHJcblxyXG4gIGNvbnN0IG51bSA9IGl0ZW1zLmxlbmd0aDtcclxuICBjb25zdCByZXN1bHRzID0gW107XHJcblxyXG5cclxuICBjb25zdCB0b3RhbENoaWxkcmVuID0gaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5jaGlsZHJlbikubWFwKGl0ZW0gPT4gaXRlbS5jaGlsZHJlbi5sZW5ndGgpLnJlZHVjZSgoKGEsIGIpID0+IGEgKyBiKSwwKTtcclxuXHJcbiAgY29uc3QgY2hpbGRBbmdsZURpZmZlcmVuY2UgPSAzNjAgLyB0b3RhbENoaWxkcmVuO1xyXG5cclxuICBsZXQgY3VycmVudFN0YXJ0TG9jYXRpb24gPSAwO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuXHJcbiAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XHJcbiAgICBjb25zdCBjaGlsZENvdW50ID0gaXRlbS5jaGlsZHJlbiA/IGl0ZW0uY2hpbGRyZW4ubGVuZ3RoIDogMDtcclxuICAgIGNvbnN0IHRvdGFsRGVncmVlcyA9IGNoaWxkQ291bnQgKiBjaGlsZEFuZ2xlRGlmZmVyZW5jZTtcclxuXHJcblxyXG4gICAgY29uc3QgZW5kRGVncmVlID0gY3VycmVudFN0YXJ0TG9jYXRpb24gKyAoY2hpbGRDb3VudCAqIGNoaWxkQW5nbGVEaWZmZXJlbmNlKTtcclxuXHJcbiAgICBjb25zdCBtaWRkbGVEZWdyZWUgPSAoZW5kRGVncmVlIC0gY3VycmVudFN0YXJ0TG9jYXRpb24pIC8gMjtcclxuXHJcblxyXG4gICAgY29uc3QgY3VycmVudEl0ZW0gPSB7fTtcclxuICAgIGN1cnJlbnRJdGVtWydpdGVtJ10gPSBpdGVtO1xyXG4gICAgY3VycmVudEl0ZW1bJ3N0YXJ0RGVncmVlJ10gPSBjdXJyZW50U3RhcnRMb2NhdGlvbjtcclxuICAgIGN1cnJlbnRJdGVtWydtaWRkbGVEZWdyZWUnXSA9IG1pZGRsZURlZ3JlZTtcclxuICAgIGN1cnJlbnRJdGVtWydlbmREZWdyZWUnXSA9IGVuZERlZ3JlZTtcclxuXHJcbiAgICBpZiAoY2hpbGRDb3VudCA+IDApIHtcclxuXHJcblxyXG4gICAgICBjdXJyZW50SXRlbVsnY2hpbGRyZW4nXSA9IGl0ZXJhdGVDaGlsZHJlbkFuZFNldEFuZ2xlcyh7Y2hpbGRyZW46IGl0ZW0uY2hpbGRyZW4sIGN1cnJlbnRJdGVtLCBhbmdsZURpZmZlcmVuY2U6IHRvdGFsRGVncmVlc30pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBjdXJyZW50U3RhcnRMb2NhdGlvbiA9IGN1cnJlbnRTdGFydExvY2F0aW9uICsgKGNoaWxkQ291bnQgKiBjaGlsZEFuZ2xlRGlmZmVyZW5jZSk7XHJcbiAgICByZXN1bHRzLnB1c2goY3VycmVudEl0ZW0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHJldHVybiByZXN1bHRzO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsQW5nbGVzQmFzZWRPblBhcmVudChpdGVtcykge1xyXG5cclxuICBjb25zdCBudW0gPSBpdGVtcy5sZW5ndGg7XHJcbiAgbGV0IHJlc3VsdHMgPSBbXTtcclxuICBsZXQgYW5nbGVEaWZmZXJlbmNlID0gMzYwIC8gbnVtO1xyXG5cclxuICBjb25zdCBkYXRhID0gZ2V0SW5pdGlhbFBvc2l0aW9uKDAsIDM2MCwgbnVtKTtcclxuXHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuXHJcbiAgICBjb25zdFxyXG4gICAgICB7c3RhcnREZWdyZWUsIG1pZGRsZURlZ3JlZSwgZW5kRGVncmVlfSA9IGdldERlZ3JlZUZvckluZGV4QmFzZWRPblNwbGl0QW5nbGUoaSwgZGF0YSk7XHJcblxyXG5cclxuICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcclxuICAgIGNvbnN0IGN1cnJlbnRJdGVtID0ge307XHJcbiAgICBjdXJyZW50SXRlbVsnaXRlbSddID0gaXRlbTtcclxuICAgIGN1cnJlbnRJdGVtWydzdGFydERlZ3JlZSddID0gc3RhcnREZWdyZWU7XHJcbiAgICBjdXJyZW50SXRlbVsnbWlkZGxlRGVncmVlJ10gPSBtaWRkbGVEZWdyZWU7XHJcbiAgICBjdXJyZW50SXRlbVsnZW5kRGVncmVlJ10gPSBlbmREZWdyZWU7XHJcblxyXG4gICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBpdGVtcy5maWx0ZXIoaXRlbSA9PiAhIWl0ZW0uY2hpbGRyZW4pLmxlbmd0aCA+IDA7XHJcbiAgICBpZiAoaGFzQ2hpbGRyZW4pIHtcclxuXHJcblxyXG4gICAgICBjdXJyZW50SXRlbVsnY2hpbGRyZW4nXSA9IGl0ZXJhdGVDaGlsZHJlbkFuZFNldEFuZ2xlcyh7Y2hpbGRyZW46IGl0ZW0uY2hpbGRyZW4sIGN1cnJlbnRJdGVtLCBhbmdsZURpZmZlcmVuY2V9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRJdGVtKTtcclxuICB9XHJcblxyXG5cclxuICByZXR1cm4gcmVzdWx0cztcclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIGl0ZXJhdGVDaGlsZHJlbkFuZFNldEFuZ2xlcyh7Y2hpbGRyZW4sIGN1cnJlbnRJdGVtLCBhbmdsZURpZmZlcmVuY2V9KSB7XHJcblxyXG5cclxuICBjb25zdCBjb3VudCA9IGNoaWxkcmVuLmxlbmd0aDtcclxuXHJcbiAgY29uc3QgY2hpbGRJdGVtcyA9IFtdO1xyXG4gIGNvbnN0IGRhdGEgPSBnZXRJbml0aWFsUG9zaXRpb24oY3VycmVudEl0ZW1bJ3N0YXJ0RGVncmVlJ10sIGFuZ2xlRGlmZmVyZW5jZSwgY291bnQpO1xyXG5cclxuXHJcbiAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7XHJcbiAgICBjb25zdCBjaGlsZEl0ZW0gPSB7fTtcclxuXHJcblxyXG4gICAgY2hpbGRJdGVtWydpdGVtJ10gPSBjaGlsZHJlbltqXTtcclxuXHJcblxyXG4gICAgY29uc3RcclxuICAgICAge3N0YXJ0RGVncmVlLCBtaWRkbGVEZWdyZWUsIGVuZERlZ3JlZX0gPSBnZXREZWdyZWVGb3JJbmRleEJhc2VkT25TcGxpdEFuZ2xlKGosIGRhdGEpO1xyXG5cclxuXHJcbiAgICBjaGlsZEl0ZW1bJ3N0YXJ0RGVncmVlJ10gPSBzdGFydERlZ3JlZTtcclxuICAgIGNoaWxkSXRlbVsnbWlkZGxlRGVncmVlJ10gPSBtaWRkbGVEZWdyZWU7XHJcbiAgICBjaGlsZEl0ZW1bJ2VuZERlZ3JlZSddID0gZW5kRGVncmVlO1xyXG5cclxuICAgIGNoaWxkSXRlbXMucHVzaChjaGlsZEl0ZW0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHJldHVybiBjaGlsZEl0ZW1zO1xyXG5cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25zT25BbmdsZXMoY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBhbmdlbHMpIHtcclxuXHJcbiAgY29uc3QgcmVzdWx0cyA9IFtdO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYW5nZWxzLmxlbmd0aDsgaSsrKSB7XHJcblxyXG4gICAgY29uc3QgZGVncmVlVG9CZURyYXduID0gYW5nZWxzW2ldO1xyXG4gICAgcmVzdWx0cy5wdXNoKHBvbGFyVG9DYXJ0ZXNpYW4oY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBkZWdyZWVUb0JlRHJhd24pKTtcclxuXHJcbiAgfVxyXG4gIHJldHVybiByZXN1bHRzO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uXHJcbmdldFBvaW50c09uQ2lyY2xlQXRBbmdlbHMoY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBhbmdlbHMpIHtcclxuXHJcbiAgY29uc3QgcmVzdWx0cyA9IFtdO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYW5nZWxzLmxlbmd0aDsgaSsrKSB7XHJcblxyXG4gICAgY29uc3QgZGVncmVlVG9CZURyYXduID0gYW5nZWxzW2ldO1xyXG4gICAgcmVzdWx0cy5wdXNoKHBvbGFyVG9DYXJ0ZXNpYW4oY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBkZWdyZWVUb0JlRHJhd24pKTtcclxuXHJcbiAgfVxyXG4gIHJldHVybiByZXN1bHRzO1xyXG59XHJcbiJdfQ==