From 7872c8490eb1bf8bb2fa173fc18216c2f5bb2d16 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Mon, 1 Jun 2020 08:07:48 -0400 Subject: [PATCH] Radial Linear Scale: Compute Value based on distance from center (#7449) * Radial Linear Scale: Compute Value based on distance from center * Code review updates --- src/scales/scale.radialLinear.js | 10 ++++++++ test/specs/scale.radialLinear.tests.js | 33 ++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/scales/scale.radialLinear.js b/src/scales/scale.radialLinear.js index f8fb11fe4..0273394f8 100644 --- a/src/scales/scale.radialLinear.js +++ b/src/scales/scale.radialLinear.js @@ -422,6 +422,16 @@ class RadialLinearScale extends LinearScaleBase { return (value - me.min) * scalingFactor; } + getValueForDistanceFromCenter(distance) { + if (isNullOrUndef(distance)) { + return NaN; + } + + const me = this; + const scaledDistance = distance / (me.drawingArea / (me.max - me.min)); + return me.options.reverse ? me.max - scaledDistance : me.min + scaledDistance; + } + getPointPosition(index, distanceFromCenter) { const me = this; const angle = me.getIndexAngle(index) - (Math.PI / 2); diff --git a/test/specs/scale.radialLinear.tests.js b/test/specs/scale.radialLinear.tests.js index 240a2edd0..1e2268652 100644 --- a/test/specs/scale.radialLinear.tests.js +++ b/test/specs/scale.radialLinear.tests.js @@ -453,6 +453,39 @@ describe('Test the radial linear scale', function() { expect(chart.scales.r.getDistanceFromCenterForValue(chart.scales.r.max)).toBe(0); }); + it('should get the correct value for a distance from the center point', function() { + var chart = window.acquireChart({ + type: 'radar', + data: { + datasets: [{ + data: [10, 5, 0, 25, 78] + }], + labels: ['label1', 'label2', 'label3', 'label4', 'label5'] + }, + options: { + scale: { + pointLabels: { + callback: function(value, index) { + return index.toString(); + } + } + } + } + }); + + expect(chart.scales.r.getValueForDistanceFromCenter(0)).toBe(chart.scales.r.min); + expect(chart.scales.r.getValueForDistanceFromCenter(227)).toBe(chart.scales.r.max); + + var dist = chart.scales.r.getDistanceFromCenterForValue(5); + expect(chart.scales.r.getValueForDistanceFromCenter(dist)).toBe(5); + + chart.scales.r.options.reverse = true; + chart.update(); + + expect(chart.scales.r.getValueForDistanceFromCenter(0)).toBe(chart.scales.r.max); + expect(chart.scales.r.getValueForDistanceFromCenter(227)).toBe(chart.scales.r.min); + }); + it('should correctly get angles for all points', function() { var chart = window.acquireChart({ type: 'radar', -- 2.47.2