Похожие чаты

Import React from 'react'; type NewData = { name: string;

value: number;
color: string;
};

export default function Towers() {
const data: NewData[] = [
{ name: 'A', value: 120, color: '#FF6384' },
{ name: 'B', value: 150, color: '#36A2EB' },
{ name: 'C', value: 90, color: '#FFCE56' },
{ name: 'D', value: 90, color: '#4BC0C0' },
{ name: 'E', value: 150, color: '#9966FF' },
{ name: 'F', value: 60, color: '#FF9F40' },
{ name: 'G', value: 60, color: '#FF6384' },
{ name: 'H', value: 150, color: '#36A2EB' },
{ name: 'I', value: 120, color: '#FFCE56' },
{ name: 'J', value: 120, color: '#4BC0C0' },
];

const totalItems = data.length;
const anglePerSlice = 360 / totalItems; // Each slice gets an equal angle
const getCoordinatesForAngle = (angle: number) => {
const radians = (angle * Math.PI) / 180;
const x = Math.cos(radians);
const y = Math.sin(radians);
return [x, y];
};

let cumulativeAngle = 0;

return (
<div style={{ width: '500px', height: '500px' }}>
<svg viewBox='0 0 2 2' style={{ transform: 'rotate(-90deg)' }}>
{data.map((slice, index) => {
const [startX, startY] = getCoordinatesForAngle(cumulativeAngle);
cumulativeAngle += anglePerSlice;
const [endX, endY] = getCoordinatesForAngle(cumulativeAngle);

const largeArcFlag = anglePerSlice > 180 ? 1 : 0;

const pathData = `
M ${startX + 1} ${startY + 1}
A 1 1 0 ${largeArcFlag} 1 ${endX + 1} ${endY + 1}
L 1 1
`;
// Calculate midpoint for label rotation
const midAngle = cumulativeAngle - anglePerSlice / 2;

return (
<g key={index}>
{/* Slice */}
<path
d={pathData}
fill={slice.color}
stroke='#fff'
strokeWidth='0.01'
onClick={() => alert(`Clicked on ${slice.name}`)}
/>
{/* Rotated Labels */}
<text
x='1'
y='1'
fontSize='0.1'
textAnchor='middle'
fill='#000'
transform={`rotate(${midAngle} 1 1) translate(0 -0.8)`}
onClick={() => alert(`Clicked on label: ${slice.name}`)}
>
{slice.name}
</text>
</g>
);
})}
{/* White inner circle for the donut effect */}
<circle cx='1' cy='1' r='0.6' fill='white' />
</svg>
</div>
);
}

1 ответов

4 просмотра

Start with simpler test data

Похожие вопросы

Обсуждают сегодня

------------------------------------------------------------------------------ 📢 MAJOR ANNOUNCEMENT: HSUITE ECOSYSTEM UPDATE 📢 @everyone Dear HbarSuite Community, After month...
Big Stones
3
Ready for some fun AND a chance to win TKO Tokens? Join us for exciting minigames in our Telegram group! 🕒 Don’t miss out—games start on today 25 October 2024, at 8 PM! Ge...
Milkyway | Tokocrypto
248
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
48
Всем привет! Скажите, никто не пытался уменьшить размер процесса ssl, которые ассоциируется с открытым соединением (не помню точное название этого процесса, но там была какая-...
Алексей
20
Let's say the current price of BCH is 400$, and average fee for transaction is .1$ If the price jumps to let's say 4000$, transaction fee should be 1$ ? I don't know exactly ...
Mohamed
25
This is so annoying and unfair and I will explain you why. Before you give answer that I have to check my ports and firewall and latest version of the node...EVERYTHING is che...
Richard
1
а проверьте, собирается ли у кого сейчас транк лазаря через делюкс? у меня вот: fpcupdeluxe: info: Lazarus Native Installer (BuildModuleCustom: UserIDE): LazBuild: building Us...
Iluha Companets
20
Мне тут приспичило встроить в программу форматировние текста SQL, расставить переносы строк и отступы так, чтобы лучше читалось. Я что-то свое изобразил, оно после ключевых сл...
Sergey Bodrov
11
why not complete my galxe task??
Crypto 6827
13
This is a big issue. Just by being a citizen of a country, you are denied to contribute to Open Source software: https://youtu.be/L5Ec5jrpLVk?si=1iIuHnMPbCB4anV-
Sharuzzaman Ahmat Raslan
72
Карта сайта