From: Evert Timberg Date: Mon, 1 Jun 2020 12:07:48 +0000 (-0400) Subject: Radial Linear Scale: Compute Value based on distance from center (#7449) X-Git-Tag: v3.0.0-beta.2~111 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7872c8490eb1bf8bb2fa173fc18216c2f5bb2d16;p=thirdparty%2FChart.js.git Radial Linear Scale: Compute Value based on distance from center (#7449) * Radial Linear Scale: Compute Value based on distance from center * Code review updates --- 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',