From 6f6b1b2d1774e6050c169421de72e320b68978f1 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Sat, 3 Apr 2021 07:58:51 -0400 Subject: [PATCH] Doughnut/Pie chart border radius (#8682) * Arc with rounded ends implementation * End style option * Working border radius implementation for arcs * Linting * Fix bug introduced when converting to new border object * Fix bugs identified by tests * Arc border radius tests * Add test to cover small borderRadii * Reduce the weight of the arc border implementation * lint fix --- docs/charts/doughnut.md | 5 + src/elements/element.arc.js | 137 ++++++++++++++++-- src/helpers/helpers.options.js | 6 +- .../borderRadius/scriptable.js | 29 ++++ .../borderRadius/scriptable.png | Bin 0 -> 13025 bytes .../borderRadius/value-corners.js | 32 ++++ .../borderRadius/value-corners.png | Bin 0 -> 13776 bytes .../borderRadius/value-large-radius.js | 36 +++++ .../borderRadius/value-large-radius.png | Bin 0 -> 15595 bytes .../borderRadius/value-small-number.js | 29 ++++ .../borderRadius/value-small-number.png | Bin 0 -> 13572 bytes types/index.esm.d.ts | 12 ++ 12 files changed, 273 insertions(+), 13 deletions(-) create mode 100644 test/fixtures/controller.doughnut/borderRadius/scriptable.js create mode 100644 test/fixtures/controller.doughnut/borderRadius/scriptable.png create mode 100644 test/fixtures/controller.doughnut/borderRadius/value-corners.js create mode 100644 test/fixtures/controller.doughnut/borderRadius/value-corners.png create mode 100644 test/fixtures/controller.doughnut/borderRadius/value-large-radius.js create mode 100644 test/fixtures/controller.doughnut/borderRadius/value-large-radius.png create mode 100644 test/fixtures/controller.doughnut/borderRadius/value-small-number.js create mode 100644 test/fixtures/controller.doughnut/borderRadius/value-small-number.png diff --git a/docs/charts/doughnut.md b/docs/charts/doughnut.md index f3d01d13a47..66c31125c15 100644 --- a/docs/charts/doughnut.md +++ b/docs/charts/doughnut.md @@ -97,6 +97,7 @@ The doughnut/pie chart allows a number of properties to be specified for each da | [`backgroundColor`](#styling) | [`Color`](../general/colors.md) | Yes | Yes | `'rgba(0, 0, 0, 0.1)'` | [`borderAlign`](#border-alignment) | `string` | Yes | Yes | `'center'` | [`borderColor`](#styling) | [`Color`](../general/colors.md) | Yes | Yes | `'#fff'` +| [`borderRadius`](#border-radius) | `number`\|`object` | Yes | Yes | `0` | [`borderWidth`](#styling) | `number` | Yes | Yes | `2` | [`circumference`](#general) | `number` | - | - | `undefined` | [`clip`](#general) | `number`\|`object` | - | - | `undefined` @@ -140,6 +141,10 @@ The following values are supported for `borderAlign`. When `'center'` is set, the borders of arcs next to each other will overlap. When `'inner'` is set, it is guaranteed that all borders will not overlap. +### Border Radius + +If this value is a number, it is applied to all corners of the arc (outerStart, outerEnd, innerStart, innerRight). If this value is an object, the `outerStart` property defines the outer-start corner's border radius. Similarly, the `outerEnd`, `innerStart`, and `innerEnd` properties can also be specified. + ### Interactions The interaction with each arc can be controlled with the following properties: diff --git a/src/elements/element.arc.js b/src/elements/element.arc.js index 376b8ebe9c1..2bdfd387dba 100644 --- a/src/elements/element.arc.js +++ b/src/elements/element.arc.js @@ -1,5 +1,7 @@ import Element from '../core/core.element'; import {_angleBetween, getAngleFromPoint, TAU, HALF_PI} from '../helpers/index'; +import {_limitValue} from '../helpers/helpers.math'; +import {_readValueToProps} from '../helpers/helpers.options'; function clipArc(ctx, element) { const {startAngle, endAngle, pixelMargin, x, y, outerRadius, innerRadius} = element; @@ -19,15 +21,134 @@ function clipArc(ctx, element) { ctx.clip(); } +function toRadiusCorners(value) { + return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']); +} + +/** + * Parse border radius from the provided options + * @param {ArcElement} arc + * @param {number} innerRadius + * @param {number} outerRadius + * @param {number} angleDelta Arc circumference in radians + * @returns + */ +function parseBorderRadius(arc, innerRadius, outerRadius, angleDelta) { + const o = toRadiusCorners(arc.options.borderRadius); + const halfThickness = (outerRadius - innerRadius) / 2; + const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2); + + // Outer limits are complicated. We want to compute the available angular distance at + // a radius of outerRadius - borderRadius because for small angular distances, this term limits. + // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners. + // + // If the borderRadius is large, that value can become negative. + // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius + // we know that the thickness term will dominate and compute the limits at that point + const computeOuterLimit = (val) => { + const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2; + return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit)); + }; + + return { + outerStart: computeOuterLimit(o.outerStart), + outerEnd: computeOuterLimit(o.outerEnd), + innerStart: _limitValue(o.innerStart, 0, innerLimit), + innerEnd: _limitValue(o.innerEnd, 0, innerLimit), + }; +} + +/** + * Convert (r, 𝜃) to (x, y) + * @param {number} r Radius from center point + * @param {number} theta Angle in radians + * @param {number} x Center X coordinate + * @param {number} y Center Y coordinate + * @returns {{ x: number; y: number }} Rectangular coordinate point + */ +function rThetaToXY(r, theta, x, y) { + return { + x: x + r * Math.cos(theta), + y: y + r * Math.sin(theta), + }; +} + +/** + * Path the arc, respecting the border radius + * + * 8 points of interest exist around the arc segment. + * These points define the intersection of the arc edges and the corners. + * + * Start End + * + * 1---------2 Outer + * / \ + * 8 3 + * | | + * | | + * 7 4 + * \ / + * 6---------5 Inner + * @param {CanvasRenderingContext2D} ctx + * @param {ArcElement} element + */ function pathArc(ctx, element) { const {x, y, startAngle, endAngle, pixelMargin} = element; const outerRadius = Math.max(element.outerRadius - pixelMargin, 0); const innerRadius = element.innerRadius + pixelMargin; + const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius(element, innerRadius, outerRadius, endAngle - startAngle); + + const outerStartAdjustedRadius = outerRadius - outerStart; + const outerEndAdjustedRadius = outerRadius - outerEnd; + const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius; + const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius; + + const innerStartAdjustedRadius = innerRadius + innerStart; + const innerEndAdjustedRadius = innerRadius + innerEnd; + const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius; + const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius; ctx.beginPath(); - ctx.arc(x, y, outerRadius, startAngle, endAngle); - ctx.arc(x, y, innerRadius, endAngle, startAngle, true); + + // The first arc segment from point 1 to point 2 + ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerEndAdjustedAngle); + + // The corner segment from point 2 to point 3 + if (outerEnd > 0) { + const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y); + ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI); + } + + // The line from point 3 to point 4 + const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y); + ctx.lineTo(p4.x, p4.y); + + // The corner segment from point 4 to point 5 + if (innerEnd > 0) { + const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y); + ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI); + } + + // The inner arc from point 5 to point 6 + ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), startAngle + (innerStart / innerRadius), true); + + // The corner segment from point 6 to point 7 + if (innerStart > 0) { + const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y); + ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI); + } + + // The line from point 7 to point 8 + const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y); + ctx.lineTo(p8.x, p8.y); + + // The corner segment from point 8 to point 1 + if (outerStart > 0) { + const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y); + ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle); + } + ctx.closePath(); } @@ -80,9 +201,7 @@ function drawFullCircleBorders(ctx, element, inner) { } function drawBorder(ctx, element) { - const {x, y, startAngle, endAngle, pixelMargin, options} = element; - const outerRadius = element.outerRadius; - const innerRadius = element.innerRadius + pixelMargin; + const {options} = element; const inner = options.borderAlign === 'inner'; if (!options.borderWidth) { @@ -105,10 +224,7 @@ function drawBorder(ctx, element) { clipArc(ctx, element); } - ctx.beginPath(); - ctx.arc(x, y, outerRadius, startAngle, endAngle); - ctx.arc(x, y, innerRadius, endAngle, startAngle, true); - ctx.closePath(); + pathArc(ctx, element); ctx.stroke(); } @@ -215,9 +331,10 @@ ArcElement.id = 'arc'; ArcElement.defaults = { borderAlign: 'center', borderColor: '#fff', + borderRadius: 0, borderWidth: 2, offset: 0, - angle: undefined + angle: undefined, }; /** diff --git a/src/helpers/helpers.options.js b/src/helpers/helpers.options.js index 6286b3e32c4..70846e725ea 100644 --- a/src/helpers/helpers.options.js +++ b/src/helpers/helpers.options.js @@ -39,7 +39,7 @@ export function toLineHeight(value, size) { const numberOrZero = v => +v || 0; -function readValueToProps(value, props) { +export function _readValueToProps(value, props) { const ret = {}; const objProps = isObject(props); const keys = objProps ? Object.keys(props) : props; @@ -64,7 +64,7 @@ function readValueToProps(value, props) { * @since 3.0.0 */ export function toTRBL(value) { - return readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'}); + return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'}); } /** @@ -75,7 +75,7 @@ export function toTRBL(value) { * @since 3.0.0 */ export function toTRBLCorners(value) { - return readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']); + return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']); } /** diff --git a/test/fixtures/controller.doughnut/borderRadius/scriptable.js b/test/fixtures/controller.doughnut/borderRadius/scriptable.js new file mode 100644 index 00000000000..9e85810549e --- /dev/null +++ b/test/fixtures/controller.doughnut/borderRadius/scriptable.js @@ -0,0 +1,29 @@ +module.exports = { + config: { + type: 'doughnut', + data: { + labels: [0, 1, 2, 3, 4, 5], + datasets: [ + { + // option in dataset + data: [0, 2, 4, null, 6, 8], + borderRadius: () => 4, + }, + ] + }, + options: { + elements: { + arc: { + backgroundColor: 'transparent', + borderColor: '#888', + } + }, + } + }, + options: { + canvas: { + height: 256, + width: 512 + } + } +}; diff --git a/test/fixtures/controller.doughnut/borderRadius/scriptable.png b/test/fixtures/controller.doughnut/borderRadius/scriptable.png new file mode 100644 index 0000000000000000000000000000000000000000..15010e3af9c3d6cc422043aa7ede6746fd27a3c8 GIT binary patch literal 13025 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/controller.doughnut/borderRadius/value-corners.js b/test/fixtures/controller.doughnut/borderRadius/value-corners.js new file mode 100644 index 00000000000..d6f473115d6 --- /dev/null +++ b/test/fixtures/controller.doughnut/borderRadius/value-corners.js @@ -0,0 +1,32 @@ +module.exports = { + config: { + type: 'doughnut', + data: { + labels: [0, 1, 2, 3, 4, 5], + datasets: [ + { + // option in dataset + data: [0, 2, 4, null, 6, 8], + borderRadius: { + outerStart: 20, + outerEnd: 40, + } + }, + ] + }, + options: { + elements: { + arc: { + backgroundColor: 'transparent', + borderColor: '#888', + } + }, + } + }, + options: { + canvas: { + height: 256, + width: 512 + } + } +}; diff --git a/test/fixtures/controller.doughnut/borderRadius/value-corners.png b/test/fixtures/controller.doughnut/borderRadius/value-corners.png new file mode 100644 index 0000000000000000000000000000000000000000..ec74b29011f928db38eaa809f456f8188eaf748d GIT binary patch literal 13776 zcmX|Ic|4S1*M4RUChJ&dlx3`uy%ZwGQnnOIYO+Nols#+AAiIc&?35(NR+HU~J;}Z% z`@S#PxA8sR_xry7(a-Wc_kEvpuKPOIxhBlumKG!3Svmj!7d-iBx6YHETFGREN<=mVe zJf^gX;cPm{{(`VW$EuAcHcxu2v6#6OHv|Dp&;T3$RVAe^2UadLGg$S*x~$1^1T z3D??|MI}vOEjCstPxJc?%{=TD^HN=l+{cCE{*Ll*rV#trkV<|6-bq3&H%Mc1L8Pr2ne{WZ#9}q35BEj0 zce>?#8P+hip&I}~GzfrW#LAp5ArcuOOrbtI%UsecI&l)U>YxuffY!85`KgT309KAKyWL;HtSdv7Eu%#pI(TLXKIym9Z| zvAzHBWH+o+iltcovDL8J6k8*`KZXp)1F(GMo7HA8Pv?H@*oMd9YRW4cFE6jsMYC_N z371+dr8S(3wZ}sY z`!sLDxe;9>UfQ9=_f(XuDK(y`nhR2{FHzWnAR8ymqkD48|iTCo=4iW8BmHg_a4UcAIC5?E`g zXYbo_&FAgsg>8dbmFOx@8u;BeU_AOlt*S&3PV}nMQXfN)tV-90kKSZY#Y0@5s|_b^ zYm>2uENm$y4Vk}(7b^xDX`L$2NG|A^FZ9nM&k2JEW%!jty)6RoD!my+(r!_j{a0#s zCbUw!pjeb*X8n6*Gi}4;sC!qyx<$J#~%JMruP!BK@OV|mo_5gN10i^(Ay+ zTXWsytsaV+)e1RSxy5~6h<|%cQUA}GQ9(8^D?WH5#fYxEn{@`7JDYVK`VLuALU$y# zrfjCbP^GsnvvzF{%B(-0DyfyWmk*VD1!shP24M^6LHOhUa=5sut{p@Z`tK$um z_|RIKyWb?N*FsAA{eF9Xvh`N{VOA31I6kZ6*re_BYo2cx>Te6KoqQ$h26^ScYeM?# z-^=|Y1$yL)3L4XuXltH=bwfPy{oaW+97uUhG(k>uqFl4}4#=i>3=#oA<^wooLa+$b z*mg)V@g$*YtX_dNqkG&Jp>6e$6S6rtbV24$yD}Ge6IuA&EBy!f`_cQ^2 zS=cxPuLFx9-|smWv*5dVp-=%ifX(wG@g48t6Il1isHt7wM5MYhEi6C_eZcIuel`GL zV?i;6?1nzO+xc1Bp6c#5!Es|+_6dln6`#Ttq1KYDzRhL)#4R*}AKW6#h0E?S`9#w} zo4cbN`y-pSmGdlQHT;A3*H5mEXJZ7IELGms-eD0y9Mh_*r-pH~TtC?KQl&i%yD;~V z*j-IlVBrOjw0Jl2SH?3_)Tfo+x%lpqSE;4*rxQAsYi3w%MVKY2am(T^G%l8p&vo-- zqXgu(-gPi|UuUUe|E7-pn^X?NVJ5)9V^)Xl$y(3( z^jH6WD7j-NaK!$PS?W1CIkychzcA7_DIviJSsKDNUJ>AXF%<6Qfu-#$MSCVx<#JGi z$I##Ez_4@A<$5(p8qOZq7{A(a+7IvYjx&Agpya9 zYmaao?`n#$rTTwzCg_%c%#TfEG3GJ>4nC@*2SjI(aYnk=1hU?E zAt}ynvMdI=&by7JgXb`s9>Uy2Ih$I~o-FWP65;5yLI#KgC0#H5FTVx@tbv)jJSQl_yORFo&zEk#f&;|c8$fskt!
  • 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 literal 0 HcmV?d00001 diff --git a/types/index.esm.d.ts b/types/index.esm.d.ts index cf2a4961c45..f2a911829bc 100644 --- a/types/index.esm.d.ts +++ b/types/index.esm.d.ts @@ -1604,6 +1604,13 @@ export interface ArcProps { circumference: number; } +export interface ArcBorderRadius { + outerStart: number; + outerEnd: number; + innerStart: number; + innerEnd: number; +} + export interface ArcOptions extends CommonElementOptions { /** * Arc stroke alignment. @@ -1613,6 +1620,11 @@ export interface ArcOptions extends CommonElementOptions { * Arc offset (in pixels). */ offset: number; + /** + * Sets the border radius for arcs + * @default 0 + */ + borderRadius: number | ArcBorderRadius; } export interface ArcHoverOptions extends CommonHoverOptions {