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 00000000000..3890d7cb64a Binary files /dev/null and b/test/fixtures/controller.polarArea/angle-lines.png differ 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) {