From 2be77032bbb5387b88a2e7ef67e8b318057a6124 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Sat, 5 Jan 2019 23:05:08 +0200 Subject: [PATCH 1/3] Polar area: startAngle in degrees, 0 at top. --- docs/charts/polar.md | 3 ++- src/controllers/controller.polarArea.js | 19 +++++++++++-------- src/scales/scale.radialLinear.js | 7 ++----- test/specs/controller.polarArea.tests.js | 2 +- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/docs/charts/polar.md b/docs/charts/polar.md index bbc9f046c4b..7e5f31c1ac8 100644 --- a/docs/charts/polar.md +++ b/docs/charts/polar.md @@ -101,7 +101,7 @@ These are the customisation options specific to Polar Area charts. These options | Name | Type | Default | Description | ---- | ---- | ------- | ----------- -| `startAngle` | `number` | `-0.5 * Math.PI` | Starting angle to draw arcs for the first item in a dataset. +| `startAngle` | `number` | `0` | Starting angle to draw arcs for the first item in a dataset. In degrees, 0 is at top. | `animation.animateRotate` | `boolean` | `true` | If true, the chart will animate in with a rotation animation. This property is in the `options.animation` object. | `animation.animateScale` | `boolean` | `true` | If true, will animate scaling the chart from the center outwards. @@ -110,6 +110,7 @@ These are the customisation options specific to Polar Area charts. These options We can also change these defaults values for each PolarArea type that is created, this object is available at `Chart.defaults.polarArea`. Changing the global options only affects charts created after the change. Existing charts are not changed. For example, to configure all new polar area charts with `animateScale = false` you would do: + ```javascript Chart.defaults.polarArea.animation.animateScale = false; ``` diff --git a/src/controllers/controller.polarArea.js b/src/controllers/controller.polarArea.js index 518b8d3d557..0063a0443df 100644 --- a/src/controllers/controller.polarArea.js +++ b/src/controllers/controller.polarArea.js @@ -32,7 +32,7 @@ defaults._set('polarArea', { } }, - startAngle: -0.5 * Math.PI, + startAngle: 0, legendCallback: function(chart) { var list = document.createElement('ul'); var data = chart.data; @@ -106,6 +106,12 @@ defaults._set('polarArea', { } }); +function getStartAngleRadians(deg) { + // radianLinear scale draws angleLines using startAngle. 0 is excepted to be at top. + // Here we adjust to standard unit circle used in drawing, where 0 is at right. + return helpers.toRadians(deg) - 0.5 * Math.PI; +} + module.exports = DatasetController.extend({ dataElementType: elements.Arc, @@ -138,13 +144,10 @@ module.exports = DatasetController.extend({ }, update: function(mode) { - var me = this; - var meta = me._cachedMeta; - var arcs = meta.data; - - me._updateRadius(); + const arcs = this._cachedMeta.data; - me.updateElements(arcs, 0, mode); + this._updateRadius(); + this.updateElements(arcs, 0, mode); }, /** @@ -175,7 +178,7 @@ module.exports = DatasetController.extend({ const scale = chart.scales.r; const centerX = scale.xCenter; const centerY = scale.yCenter; - const datasetStartAngle = opts.startAngle || 0; + const datasetStartAngle = getStartAngleRadians(opts.startAngle); let angle = datasetStartAngle; let i; diff --git a/src/scales/scale.radialLinear.js b/src/scales/scale.radialLinear.js index ddf7fac1317..d659819a328 100644 --- a/src/scales/scale.radialLinear.js +++ b/src/scales/scale.radialLinear.js @@ -380,14 +380,11 @@ class RadialLinearScale extends LinearScaleBase { getIndexAngle(index) { var chart = this.chart; - var angleMultiplier = 360 / chart.data.labels.length; + var angleMultiplier = (Math.PI * 2) / chart.data.labels.length; var options = chart.options || {}; var startAngle = options.startAngle || 0; - // Start from the top instead of right, so remove a quarter of the circle - var angle = (index * angleMultiplier + startAngle) % 360; - - return (angle < 0 ? angle + 360 : angle) * Math.PI * 2 / 360; + return index * angleMultiplier + helpers.toRadians(startAngle); } getDistanceFromCenterForValue(value) { diff --git a/test/specs/controller.polarArea.tests.js b/test/specs/controller.polarArea.tests.js index f7ea6e6a5bf..7780f9fde3b 100644 --- a/test/specs/controller.polarArea.tests.js +++ b/test/specs/controller.polarArea.tests.js @@ -156,7 +156,7 @@ describe('Chart.controllers.polarArea', function() { showLines: true, legend: false, title: false, - startAngle: 0, // default is -0.5 * Math.PI + startAngle: 90, // default is 0 elements: { arc: { backgroundColor: 'rgb(255, 0, 0)', From 90ac322841a09cb19c427faee46db88d3aa226b9 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Sun, 22 Dec 2019 22:21:26 +0200 Subject: [PATCH 2/3] v3 stuff, add test --- src/controllers/controller.polarArea.js | 4 +- src/helpers/helpers.math.js | 8 ++-- src/scales/scale.radialLinear.js | 8 ++-- .../controller.polarArea/angle-lines.json | 35 ++++++++++++++++++ .../controller.polarArea/angle-lines.png | Bin 0 -> 30736 bytes test/specs/scale.radialLinear.tests.js | 2 +- 6 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 test/fixtures/controller.polarArea/angle-lines.json create mode 100644 test/fixtures/controller.polarArea/angle-lines.png diff --git a/src/controllers/controller.polarArea.js b/src/controllers/controller.polarArea.js index 0063a0443df..7ec26bc1139 100644 --- a/src/controllers/controller.polarArea.js +++ b/src/controllers/controller.polarArea.js @@ -107,9 +107,9 @@ defaults._set('polarArea', { }); function getStartAngleRadians(deg) { - // radianLinear scale draws angleLines using startAngle. 0 is excepted to be at top. + // radialLinear scale draws angleLines using startAngle. 0 is excepted to be at top. // Here we adjust to standard unit circle used in drawing, where 0 is at right. - return helpers.toRadians(deg) - 0.5 * Math.PI; + return helpers.math.toRadians(deg) - 0.5 * Math.PI; } module.exports = DatasetController.extend({ diff --git a/src/helpers/helpers.math.js b/src/helpers/helpers.math.js index d5a5680b8c5..259d4c985ee 100644 --- a/src/helpers/helpers.math.js +++ b/src/helpers/helpers.math.js @@ -83,11 +83,11 @@ export const sign = Math.sign ? }; export function toRadians(degrees) { - return degrees * (Math.PI / 180); + return degrees * (PI / 180); } export function toDegrees(radians) { - return radians * (180 / Math.PI); + return radians * (180 / PI); } /** @@ -118,8 +118,8 @@ export function getAngleFromPoint(centrePoint, anglePoint) { var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); - if (angle < (-0.5 * Math.PI)) { - angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] + if (angle < (-0.5 * PI)) { + angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2] } return { diff --git a/src/scales/scale.radialLinear.js b/src/scales/scale.radialLinear.js index d659819a328..c33232e3dca 100644 --- a/src/scales/scale.radialLinear.js +++ b/src/scales/scale.radialLinear.js @@ -2,7 +2,7 @@ import defaults from '../core/core.defaults'; import helpers from '../helpers/index'; -import {isNumber, toDegrees} from '../helpers/helpers.math'; +import {isNumber, toDegrees, toRadians, _normalizeAngle} from '../helpers/helpers.math'; import LinearScaleBase from './scale.linearbase'; import Ticks from '../core/core.ticks'; @@ -157,7 +157,7 @@ function fitWithPointLabels(scale) { // Add quarter circle to make degree 0 mean top of circle var angleRadians = scale.getIndexAngle(i); - var angle = toDegrees(angleRadians) % 360; + var angle = toDegrees(angleRadians); var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); @@ -380,11 +380,11 @@ class RadialLinearScale extends LinearScaleBase { getIndexAngle(index) { var chart = this.chart; - var angleMultiplier = (Math.PI * 2) / chart.data.labels.length; + var angleMultiplier = Math.PI * 2 / chart.data.labels.length; var options = chart.options || {}; var startAngle = options.startAngle || 0; - return index * angleMultiplier + helpers.toRadians(startAngle); + return _normalizeAngle(index * angleMultiplier + toRadians(startAngle)); } getDistanceFromCenterForValue(value) { diff --git a/test/fixtures/controller.polarArea/angle-lines.json b/test/fixtures/controller.polarArea/angle-lines.json new file mode 100644 index 00000000000..01474c028d6 --- /dev/null +++ b/test/fixtures/controller.polarArea/angle-lines.json @@ -0,0 +1,35 @@ +{ + "threshold": 0.05, + "config": { + "type": "polarArea", + "data": { + "labels": ["A", "B", "C", "D", "E"], + "datasets": [{ + "data": [11, 16, 21, 7, 10], + "backgroundColor": [ + "rgba(255, 99, 132, 0.8)", + "rgba(54, 162, 235, 0.8)", + "rgba(255, 206, 86, 0.8)", + "rgba(75, 192, 192, 0.8)", + "rgba(153, 102, 255, 0.8)", + "rgba(255, 159, 64, 0.8)" + ] + }] + }, + "options": { + "responsive": false, + "legend": false, + "title": false, + "scale": { + "display": true, + "angleLines": { + "display": true, + "color": "#000" + }, + "ticks": { + "display": false + } + } + } + } +} diff --git a/test/fixtures/controller.polarArea/angle-lines.png b/test/fixtures/controller.polarArea/angle-lines.png new file mode 100644 index 0000000000000000000000000000000000000000..3890d7cb64ae40b4dfcc3a71aeaf4fad322c6eac GIT binary patch literal 30736 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 literal 0 HcmV?d00001 diff --git a/test/specs/scale.radialLinear.tests.js b/test/specs/scale.radialLinear.tests.js index a64157a7e69..d8a50712f76 100644 --- a/test/specs/scale.radialLinear.tests.js +++ b/test/specs/scale.radialLinear.tests.js @@ -535,7 +535,7 @@ describe('Test the radial linear scale', function() { scale.ctx.getCalls().filter(function(x) { return x.name === 'setTextAlign'; }).forEach(function(x, i) { - expect(x.args[0]).toBe(expected.textAlign[i]); + expect(x.args[0]).withContext('startAngle: ' + expected.startAngle + ', tick: ' + i).toBe(expected.textAlign[i]); }); scale.ctx.getCalls().filter(function(x) { From 4c9240c922479e432ac4e4cfa5334393aaecb28e Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Fri, 27 Dec 2019 09:35:57 +0200 Subject: [PATCH 3/3] Add migration note --- docs/getting-started/v3-migration.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/getting-started/v3-migration.md b/docs/getting-started/v3-migration.md index 379863d8009..31db6642792 100644 --- a/docs/getting-started/v3-migration.md +++ b/docs/getting-started/v3-migration.md @@ -32,6 +32,7 @@ Chart.js 3.0 introduces a number of breaking changes. Chart.js 2.0 was released ### Options +* `Polar area` `startAngle` option is now consistent with `Radar`, 0 is at top and value is in degrees. Default is changed from `-½π` to `0`. * `scales.[x/y]Axes` arrays were removed. Scales are now configured directly to `options.scales` object with the object key being the scale Id. * `scales.[x/y]Axes.barPercentage` was moved to dataset option `barPercentage` * `scales.[x/y]Axes.barThickness` was moved to dataset option `barThickness`