From d4109ca14e4499935fa3ce09ae9562db8cbed8a3 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Fri, 10 Jan 2020 15:30:29 -0800 Subject: [PATCH] Polar area: startAngle in degrees, 0 at top. (#6936) * Polar area: startAngle in degrees, 0 at top. Co-authored-by: Jukka Kurkela --- docs/charts/polar.md | 3 +- docs/getting-started/v3-migration.md | 1 + src/controllers/controller.polarArea.js | 19 ++++++---- src/helpers/helpers.math.js | 8 ++-- src/scales/scale.radialLinear.js | 11 ++---- .../controller.polarArea/angle-lines.json | 35 ++++++++++++++++++ .../controller.polarArea/angle-lines.png | Bin 0 -> 30736 bytes test/specs/controller.polarArea.tests.js | 2 +- test/specs/scale.radialLinear.tests.js | 2 +- 9 files changed, 59 insertions(+), 22 deletions(-) create mode 100644 test/fixtures/controller.polarArea/angle-lines.json create mode 100644 test/fixtures/controller.polarArea/angle-lines.png diff --git a/docs/charts/polar.md b/docs/charts/polar.md index 3782d2b83..e4bb62859 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. @@ -112,6 +112,7 @@ The polar area chart uses the [radialLinear](../axes/radial/linear.md) scale. Ad 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/docs/getting-started/v3-migration.md b/docs/getting-started/v3-migration.md index 8ceb8fb01..5f8cea126 100644 --- a/docs/getting-started/v3-migration.md +++ b/docs/getting-started/v3-migration.md @@ -43,6 +43,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` diff --git a/src/controllers/controller.polarArea.js b/src/controllers/controller.polarArea.js index ac07a3bb3..8eb1e6b0e 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, legend: { labels: { generateLabels: function(chart) { @@ -85,6 +85,12 @@ defaults._set('polarArea', { } }); +function getStartAngleRadians(deg) { + // radialLinear scale draws angleLines using startAngle. 0 is expected to be at top. + // Here we adjust to standard unit circle used in drawing, where 0 is at right. + return helpers.math.toRadians(deg) - 0.5 * Math.PI; +} + export default DatasetController.extend({ dataElementType: elements.Arc, @@ -117,13 +123,10 @@ export default 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); }, /** @@ -154,7 +157,7 @@ export default 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/helpers/helpers.math.js b/src/helpers/helpers.math.js index 215b44db7..a08ed5ea5 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 433088b0f..0150ba70d 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,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 _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 000000000..01474c028 --- /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 Hc-jL100001 diff --git a/test/specs/controller.polarArea.tests.js b/test/specs/controller.polarArea.tests.js index f7ea6e6a5..7780f9fde 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)', diff --git a/test/specs/scale.radialLinear.tests.js b/test/specs/scale.radialLinear.tests.js index a64157a7e..d8a50712f 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) { -- 2.47.2