]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Radial Linear Scale: Compute Value based on distance from center (#7449)
authorEvert Timberg <evert.timberg+github@gmail.com>
Mon, 1 Jun 2020 12:07:48 +0000 (08:07 -0400)
committerGitHub <noreply@github.com>
Mon, 1 Jun 2020 12:07:48 +0000 (08:07 -0400)
* Radial Linear Scale: Compute Value based on distance from center

* Code review updates

src/scales/scale.radialLinear.js
test/specs/scale.radialLinear.tests.js

index f8fb11fe4584d424049ddd11e4b8bd3f94bf267c..0273394f8d1e6d2619414b5ead0d1db6376e1ef9 100644 (file)
@@ -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);
index 240a2edd0c8f48ee55f53c06f23f059b5c9ca75e..1e2268652ddc7794ce79de3cae091a56470dc070 100644 (file)
@@ -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',