1- import { FULL_CIRCLE_ANGLE } from ' ../constants/geometry.js' ;
1+ import { FULL_CIRCLE_ANGLE } from " ../constants/geometry.js" ;
22
33export const polarToCartesian = ( cx , cy , r , angleDeg ) => {
44 const angleRad = ( angleDeg - 90 ) * Math . PI / 180 ;
@@ -11,9 +11,19 @@ export const polarToCartesian = (cx, cy, r, angleDeg) => {
1111export const describeSegment = ( cx , cy , innerR , outerR , startAngle , endAngle ) => {
1212 const startOuter = polarToCartesian ( cx , cy , outerR , endAngle ) ;
1313 const endOuter = polarToCartesian ( cx , cy , outerR , startAngle ) ;
14+ const largeArcFlag = endAngle - startAngle <= 180 ? '0' : '1' ;
15+
16+ if ( innerR === 0 ) {
17+ return `
18+ M ${ cx } ${ cy }
19+ L ${ startOuter . x } ${ startOuter . y }
20+ A ${ outerR } ${ outerR } 0 ${ largeArcFlag } 0 ${ endOuter . x } ${ endOuter . y }
21+ Z
22+ ` . trim ( ) ;
23+ }
24+
1425 const startInner = polarToCartesian ( cx , cy , innerR , startAngle ) ;
1526 const endInner = polarToCartesian ( cx , cy , innerR , endAngle ) ;
16- const largeArcFlag = endAngle - startAngle <= 180 ? "0" : "1" ;
1727
1828 return `
1929 M ${ startOuter . x } ${ startOuter . y }
@@ -24,15 +34,13 @@ export const describeSegment = (cx, cy, innerR, outerR, startAngle, endAngle) =>
2434 ` . trim ( ) ;
2535} ;
2636
27- export const createDonutSegments = ( languages , cx , geometry , colours ) => {
28- let currentAngle = 0 ;
37+ export const createDonutSegments = ( languages , cx , geometry , colours , stroke ) => {
38+ let currentAngle = - 0.1 ;
2939
3040 return languages . map ( ( lang , i ) => {
31- const isLast = i === languages . length - 1 ;
32- let angle = isLast ? 360 - currentAngle : ( lang . pct / 100 ) * 360 ;
33-
34- const segmentAngle = Math . min ( currentAngle + angle , FULL_CIRCLE_ANGLE ) ;
41+ let angle = ( lang . pct / 100 ) * 360 ;
3542
43+ const segmentAngle = Math . min ( currentAngle + angle + 0.1 , FULL_CIRCLE_ANGLE ) ;
3644 const path = describeSegment (
3745 cx ,
3846 geometry . CENTER_Y ,
@@ -41,8 +49,12 @@ export const createDonutSegments = (languages, cx, geometry, colours) => {
4149 currentAngle ,
4250 segmentAngle
4351 ) ;
44-
52+
4553 currentAngle += angle ;
46- return `<path d="${ path } " fill="${ colours [ i ] } "/>` ;
54+ const fillColour = colours [ i % colours . length ] ;
55+ const strokeAttr = stroke
56+ ? ` stroke="#000" stroke-width="0.5" stroke-linejoin="round"`
57+ : ` stroke="${ fillColour } " stroke-width="0.2"` ;
58+ return `<path d="${ path } " fill="${ fillColour } "${ strokeAttr } shape-rendering="geometricPrecision"/>` ;
4759 } ) . join ( '' ) ;
4860}
0 commit comments