From 74961d1c868e47429fc1206679f0c9ba09b75ab5 Mon Sep 17 00:00:00 2001 From: Pierre <73789471+R2Jeu-prive@users.noreply.github.com> Date: Tue, 15 Apr 2025 15:32:13 +0200 Subject: [PATCH] Add selfJoin option for doughnut graphs (#12054) Co-authored-by: Pierre Gueguen --- src/elements/element.arc.ts | 42 +++++++++++++++++- src/types/index.d.ts | 6 +++ .../controller.doughnut/selfJoin/doughnut.js | 25 +++++++++++ .../controller.doughnut/selfJoin/doughnut.png | Bin 0 -> 14751 bytes .../controller.doughnut/selfJoin/pie.js | 26 +++++++++++ .../controller.doughnut/selfJoin/pie.png | Bin 0 -> 11313 bytes 6 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/controller.doughnut/selfJoin/doughnut.js create mode 100644 test/fixtures/controller.doughnut/selfJoin/doughnut.png create mode 100644 test/fixtures/controller.doughnut/selfJoin/pie.js create mode 100644 test/fixtures/controller.doughnut/selfJoin/pie.png diff --git a/src/elements/element.arc.ts b/src/elements/element.arc.ts index e2bd26f52..42f41f045 100644 --- a/src/elements/element.arc.ts +++ b/src/elements/element.arc.ts @@ -1,9 +1,42 @@ import Element from '../core/core.element.js'; import {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js'; -import {PI, _isBetween, _limitValue} from '../helpers/helpers.math.js'; +import {PI, _angleDiff, _normalizeAngle, _isBetween, _limitValue} from '../helpers/helpers.math.js'; import {_readValueToProps} from '../helpers/helpers.options.js'; import type {ArcOptions, Point} from '../types/index.js'; +function clipSelf(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) { + const {startAngle, x, y, outerRadius, innerRadius, options} = element; + const {borderWidth, borderJoinStyle} = options; + const outerAngleClip = Math.min(borderWidth / outerRadius, _normalizeAngle(startAngle - endAngle)); + ctx.beginPath(); + ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2); + + if (innerRadius > 0) { + const innerAngleClip = Math.min(borderWidth / innerRadius, _normalizeAngle(startAngle - endAngle)); + ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true); + } else { + const clipWidth = Math.min(borderWidth / 2, outerRadius * _normalizeAngle(startAngle - endAngle)); + + if (borderJoinStyle === 'round') { + ctx.arc(x, y, clipWidth, endAngle - PI / 2, startAngle + PI / 2, true); + } else if (borderJoinStyle === 'bevel') { + const r = 2 * clipWidth * clipWidth; + const endX = -r * Math.cos(endAngle + PI / 2) + x; + const endY = -r * Math.sin(endAngle + PI / 2) + y; + const startX = r * Math.cos(startAngle + PI / 2) + x; + const startY = r * Math.sin(startAngle + PI / 2) + y; + ctx.lineTo(endX, endY); + ctx.lineTo(startX, startY); + } + } + ctx.closePath(); + + ctx.moveTo(0, 0); + ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height); + + ctx.clip('evenodd'); +} + function clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) { const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element; @@ -213,7 +246,7 @@ function drawBorder( circular: boolean, ) { const {fullCircles, startAngle, circumference, options} = element; - const {borderWidth, borderJoinStyle, borderDash, borderDashOffset} = options; + const {borderWidth, borderJoinStyle, borderDash, borderDashOffset, borderRadius} = options; const inner = options.borderAlign === 'inner'; if (!borderWidth) { @@ -246,6 +279,10 @@ function drawBorder( clipArc(ctx, element, endAngle); } + if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') { + clipSelf(ctx, element, endAngle); + } + if (!fullCircles) { pathArc(ctx, element, offset, spacing, endAngle, circular); ctx.stroke(); @@ -276,6 +313,7 @@ export default class ArcElement extends Element { spacing: 0, angle: undefined, circular: true, + selfJoin: false, }; static defaultRoutes = { diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 807fe8208..175336ec7 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -1847,6 +1847,12 @@ export interface ArcBorderRadius { } export interface ArcOptions extends CommonElementOptions { + /** + * If true, Arc can take up 100% of a circular graph without any visual split or cut. This option doesn't support borderRadius and borderJoinStyle miter + * @default true + */ + selfJoin: boolean; + /** * Arc stroke alignment. */ diff --git a/test/fixtures/controller.doughnut/selfJoin/doughnut.js b/test/fixtures/controller.doughnut/selfJoin/doughnut.js new file mode 100644 index 000000000..f29939cec --- /dev/null +++ b/test/fixtures/controller.doughnut/selfJoin/doughnut.js @@ -0,0 +1,25 @@ +module.exports = { + config: { + type: 'doughnut', + data: { + labels: ['Red'], + datasets: [ + { + // option in dataset + data: [100], + borderWidth: 15, + backgroundColor: '#FF0000', + borderColor: '#000000', + borderAlign: 'center', + selfJoin: true + } + ] + } + }, + options: { + canvas: { + height: 256, + width: 512 + } + } +}; diff --git a/test/fixtures/controller.doughnut/selfJoin/doughnut.png b/test/fixtures/controller.doughnut/selfJoin/doughnut.png new file mode 100644 index 0000000000000000000000000000000000000000..af2d4b438736b45f0b08649e41050d3a17cb5da4 GIT binary patch literal 14751 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 Nt7W8Fs_uCA{{eulPc{Gm literal 0 Hc-jL100001 -- 2.47.3