From: Jukka Kurkela Date: Thu, 20 May 2021 07:01:47 +0000 (+0300) Subject: Further improve linear tick collision estimation (#9129) X-Git-Tag: v3.3.0~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a6f0b37dfe0a9736343814fafd45823f272fe66c;p=thirdparty%2FChart.js.git Further improve linear tick collision estimation (#9129) * Further improve linear tick collision estimation * More tolerance * Re-create fixtures * And more tolerance --- diff --git a/src/core/core.scale.js b/src/core/core.scale.js index f5feb9fff..8850ad759 100644 --- a/src/core/core.scale.js +++ b/src/core/core.scale.js @@ -1665,6 +1665,6 @@ export default class Scale extends Element { _maxDigits() { const me = this; const fontSize = me._resolveTickFontOptions(0).lineHeight; - return me.isHorizontal() ? me.width / fontSize / 0.7 : me.height / fontSize; + return (me.isHorizontal() ? me.width : me.height) / fontSize; } } diff --git a/src/scales/scale.linear.js b/src/scales/scale.linear.js index e9617fb19..d29772772 100644 --- a/src/scales/scale.linear.js +++ b/src/scales/scale.linear.js @@ -1,6 +1,7 @@ import {isFinite} from '../helpers/helpers.core'; import LinearScaleBase from './scale.linearbase'; import Ticks from '../core/core.ticks'; +import {toRadians} from '../helpers'; export default class LinearScale extends LinearScaleBase { @@ -21,12 +22,12 @@ export default class LinearScale extends LinearScaleBase { */ computeTickLimit() { const me = this; - - if (me.isHorizontal()) { - return Math.ceil(me.width / 40); - } + const horizontal = me.isHorizontal(); + const length = horizontal ? me.width : me.height; + const minRotation = toRadians(me.options.ticks.minRotation); + const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001; const tickFont = me._resolveTickFontOptions(0); - return Math.ceil(me.height / tickFont.lineHeight); + return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio)); } // Utils diff --git a/src/scales/scale.linearbase.js b/src/scales/scale.linearbase.js index cb299cf43..ab2c4b91e 100644 --- a/src/scales/scale.linearbase.js +++ b/src/scales/scale.linearbase.js @@ -36,7 +36,7 @@ function generateTicks(generationOptions, dataRange) { const minDefined = !isNullOrUndef(min); const maxDefined = !isNullOrUndef(max); const countDefined = !isNullOrUndef(count); - const minSpacing = (rmax - rmin) / maxDigits; + const minSpacing = (rmax - rmin) / (maxDigits + 1); let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit; let factor, niceMin, niceMax, numSpaces; @@ -135,12 +135,10 @@ function generateTicks(generationOptions, dataRange) { } function relativeLabelSize(value, minSpacing, {horizontal, minRotation}) { - const rot = toRadians(minRotation); - const useLength = (horizontal && minRotation <= 45) || (!horizontal && minRotation >= 45); - const l = useLength ? minSpacing * ('' + value).length : 0; - const sin = Math.sin(rot); - const cos = Math.cos(rot); - return horizontal ? cos * l + sin * minSpacing : sin * l + cos * minSpacing; + const rad = toRadians(minRotation); + const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001; + const length = 0.75 * minSpacing * ('' + value).length; + return Math.min(minSpacing / ratio, length); } export default class LinearScaleBase extends Scale { diff --git a/test/fixtures/scale.linear/min-max-skip/edge-case-1.js b/test/fixtures/scale.linear/min-max-skip/edge-case-1.js index 89a6dd883..ba0d1beda 100644 --- a/test/fixtures/scale.linear/min-max-skip/edge-case-1.js +++ b/test/fixtures/scale.linear/min-max-skip/edge-case-1.js @@ -24,8 +24,8 @@ module.exports = { options: { spriteText: true, canvas: { - height: 211, - width: 408 + height: 196, + width: 407 } } }; diff --git a/test/fixtures/scale.linear/min-max-skip/edge-case-1.png b/test/fixtures/scale.linear/min-max-skip/edge-case-1.png index 9401c0eb4..11cb48996 100644 Binary files a/test/fixtures/scale.linear/min-max-skip/edge-case-1.png and b/test/fixtures/scale.linear/min-max-skip/edge-case-1.png differ diff --git a/test/fixtures/scale.linear/min-max-skip/edge-case-2.js b/test/fixtures/scale.linear/min-max-skip/edge-case-2.js index 8325a4d68..b99037e14 100644 --- a/test/fixtures/scale.linear/min-max-skip/edge-case-2.js +++ b/test/fixtures/scale.linear/min-max-skip/edge-case-2.js @@ -24,8 +24,8 @@ module.exports = { options: { spriteText: true, canvas: { - height: 212, - width: 409 + height: 197, + width: 420 } } }; diff --git a/test/fixtures/scale.linear/min-max-skip/edge-case-2.png b/test/fixtures/scale.linear/min-max-skip/edge-case-2.png index f2f878f89..b49359b0c 100644 Binary files a/test/fixtures/scale.linear/min-max-skip/edge-case-2.png and b/test/fixtures/scale.linear/min-max-skip/edge-case-2.png differ diff --git a/test/fixtures/scale.linear/min-max-skip/edge-case-3.js b/test/fixtures/scale.linear/min-max-skip/edge-case-3.js index eca5a110f..6b0d03aa9 100644 --- a/test/fixtures/scale.linear/min-max-skip/edge-case-3.js +++ b/test/fixtures/scale.linear/min-max-skip/edge-case-3.js @@ -24,8 +24,8 @@ module.exports = { options: { spriteText: true, canvas: { - height: 213, - width: 536 + height: 199, + width: 556 } } }; diff --git a/test/fixtures/scale.linear/min-max-skip/edge-case-3.png b/test/fixtures/scale.linear/min-max-skip/edge-case-3.png index 55cc3cbdb..bb9b350f4 100644 Binary files a/test/fixtures/scale.linear/min-max-skip/edge-case-3.png and b/test/fixtures/scale.linear/min-max-skip/edge-case-3.png differ diff --git a/test/fixtures/scale.linear/min-max-skip/edge-case-4.js b/test/fixtures/scale.linear/min-max-skip/edge-case-4.js index 3993e3798..2ff7b8b73 100644 --- a/test/fixtures/scale.linear/min-max-skip/edge-case-4.js +++ b/test/fixtures/scale.linear/min-max-skip/edge-case-4.js @@ -24,8 +24,8 @@ module.exports = { options: { spriteText: true, canvas: { - height: 214, - width: 537 + height: 200, + width: 557 } } }; diff --git a/test/fixtures/scale.linear/min-max-skip/edge-case-4.png b/test/fixtures/scale.linear/min-max-skip/edge-case-4.png index 2f7f6276b..9106a49f8 100644 Binary files a/test/fixtures/scale.linear/min-max-skip/edge-case-4.png and b/test/fixtures/scale.linear/min-max-skip/edge-case-4.png differ diff --git a/test/fixtures/scale.linear/min-max-skip/rotated-case-1.js b/test/fixtures/scale.linear/min-max-skip/rotated-case-1.js index bc9d26e98..cbc8999b2 100644 --- a/test/fixtures/scale.linear/min-max-skip/rotated-case-1.js +++ b/test/fixtures/scale.linear/min-max-skip/rotated-case-1.js @@ -1,6 +1,6 @@ module.exports = { description: 'https://github.com/chartjs/Chart.js/issues/9025', - threshold: 0.15, + threshold: 0.2, config: { type: 'scatter', options: { @@ -18,7 +18,7 @@ module.exports = { min: 230, ticks: { autoSkip: false, - minRotation: 35 + minRotation: 67.5 } } } @@ -27,8 +27,8 @@ module.exports = { options: { spriteText: true, canvas: { - height: 211, - width: 415 + height: 231, + width: 221 } } }; diff --git a/test/fixtures/scale.linear/min-max-skip/rotated-case-1.png b/test/fixtures/scale.linear/min-max-skip/rotated-case-1.png index c23af5493..358ef0172 100644 Binary files a/test/fixtures/scale.linear/min-max-skip/rotated-case-1.png and b/test/fixtures/scale.linear/min-max-skip/rotated-case-1.png differ diff --git a/test/fixtures/scale.linear/min-max-skip/rotated-case-2.js b/test/fixtures/scale.linear/min-max-skip/rotated-case-2.js index 7179518a7..5f1fbb8d9 100644 --- a/test/fixtures/scale.linear/min-max-skip/rotated-case-2.js +++ b/test/fixtures/scale.linear/min-max-skip/rotated-case-2.js @@ -1,6 +1,6 @@ module.exports = { description: 'https://github.com/chartjs/Chart.js/issues/9025', - threshold: 0.15, + threshold: 0.2, config: { type: 'scatter', options: { @@ -18,7 +18,7 @@ module.exports = { min: 230, ticks: { autoSkip: false, - minRotation: 35 + minRotation: 67.5 } } } @@ -27,8 +27,8 @@ module.exports = { options: { spriteText: true, canvas: { - height: 214, - width: 416 + height: 232, + width: 222 } } }; diff --git a/test/fixtures/scale.linear/min-max-skip/rotated-case-2.png b/test/fixtures/scale.linear/min-max-skip/rotated-case-2.png index 335a03b4d..ef7e97d90 100644 Binary files a/test/fixtures/scale.linear/min-max-skip/rotated-case-2.png and b/test/fixtures/scale.linear/min-max-skip/rotated-case-2.png differ diff --git a/test/fixtures/scale.linear/min-max-skip/rotated-case-3.js b/test/fixtures/scale.linear/min-max-skip/rotated-case-3.js index 22d8426e3..71fb0e704 100644 --- a/test/fixtures/scale.linear/min-max-skip/rotated-case-3.js +++ b/test/fixtures/scale.linear/min-max-skip/rotated-case-3.js @@ -1,6 +1,6 @@ module.exports = { description: 'https://github.com/chartjs/Chart.js/issues/9025', - threshold: 0.15, + threshold: 0.2, config: { type: 'scatter', options: { @@ -18,7 +18,7 @@ module.exports = { min: 230, ticks: { autoSkip: false, - minRotation: 35 + minRotation: 67.5 } } } @@ -27,8 +27,8 @@ module.exports = { options: { spriteText: true, canvas: { - height: 216, - width: 520 + height: 234, + width: 224 } } }; diff --git a/test/fixtures/scale.linear/min-max-skip/rotated-case-3.png b/test/fixtures/scale.linear/min-max-skip/rotated-case-3.png index 790f5525e..a6c31dfaf 100644 Binary files a/test/fixtures/scale.linear/min-max-skip/rotated-case-3.png and b/test/fixtures/scale.linear/min-max-skip/rotated-case-3.png differ diff --git a/test/fixtures/scale.linear/min-max-skip/rotated-case-4.js b/test/fixtures/scale.linear/min-max-skip/rotated-case-4.js index 6da47127a..c639b3c5b 100644 --- a/test/fixtures/scale.linear/min-max-skip/rotated-case-4.js +++ b/test/fixtures/scale.linear/min-max-skip/rotated-case-4.js @@ -1,6 +1,6 @@ module.exports = { description: 'https://github.com/chartjs/Chart.js/issues/9025', - threshold: 0.15, + threshold: 0.2, config: { type: 'scatter', options: { @@ -18,7 +18,7 @@ module.exports = { min: 230, ticks: { autoSkip: false, - minRotation: 35 + minRotation: 67.5 } } } @@ -27,8 +27,8 @@ module.exports = { options: { spriteText: true, canvas: { - height: 217, - width: 521 + height: 235, + width: 225 } } }; diff --git a/test/fixtures/scale.linear/min-max-skip/rotated-case-4.png b/test/fixtures/scale.linear/min-max-skip/rotated-case-4.png index df57d4f91..9bdae09e5 100644 Binary files a/test/fixtures/scale.linear/min-max-skip/rotated-case-4.png and b/test/fixtures/scale.linear/min-max-skip/rotated-case-4.png differ diff --git a/test/fixtures/scale.linear/rotated-45.js b/test/fixtures/scale.linear/rotated-45.js new file mode 100644 index 000000000..7d9060f47 --- /dev/null +++ b/test/fixtures/scale.linear/rotated-45.js @@ -0,0 +1,38 @@ +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/9025', + threshold: 0.2, + config: { + type: 'scatter', + options: { + scales: { + y: { + min: 1612781975085.5466, + max: 1620287255085.5466, + ticks: { + autoSkip: false, + minRotation: 45, + maxRotation: 45, + count: 13 + } + }, + x: { + min: 1612781975085.5466, + max: 1620287255085.5466, + ticks: { + autoSkip: false, + minRotation: 45, + maxRotation: 45, + count: 13 + } + } + } + } + }, + options: { + spriteText: true, + canvas: { + height: 350, + width: 350 + } + } +}; diff --git a/test/fixtures/scale.linear/rotated-45.png b/test/fixtures/scale.linear/rotated-45.png new file mode 100644 index 000000000..dc5e19d78 Binary files /dev/null and b/test/fixtures/scale.linear/rotated-45.png differ diff --git a/test/fixtures/scale.linear/rotated-5.js b/test/fixtures/scale.linear/rotated-5.js new file mode 100644 index 000000000..0f654816e --- /dev/null +++ b/test/fixtures/scale.linear/rotated-5.js @@ -0,0 +1,34 @@ +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/9025', + threshold: 0.2, + config: { + type: 'scatter', + options: { + scales: { + y: { + min: 0, + max: 500000, + ticks: { + minRotation: 5, + maxRotation: 5, + } + }, + x: { + min: 0, + max: 500000, + ticks: { + minRotation: 5, + maxRotation: 5, + } + } + } + } + }, + options: { + spriteText: true, + canvas: { + height: 350, + width: 350 + } + } +}; diff --git a/test/fixtures/scale.linear/rotated-5.png b/test/fixtures/scale.linear/rotated-5.png new file mode 100644 index 000000000..64b9fcf8a Binary files /dev/null and b/test/fixtures/scale.linear/rotated-5.png differ diff --git a/test/fixtures/scale.linear/rotated-85.js b/test/fixtures/scale.linear/rotated-85.js new file mode 100644 index 000000000..d367beac9 --- /dev/null +++ b/test/fixtures/scale.linear/rotated-85.js @@ -0,0 +1,34 @@ +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/9025', + threshold: 0.2, + config: { + type: 'scatter', + options: { + scales: { + y: { + min: 0, + max: 500000, + ticks: { + minRotation: 85, + maxRotation: 85, + } + }, + x: { + min: 0, + max: 500000, + ticks: { + minRotation: 85, + maxRotation: 85, + } + } + } + } + }, + options: { + spriteText: true, + canvas: { + height: 350, + width: 350 + } + } +}; diff --git a/test/fixtures/scale.linear/rotated-85.png b/test/fixtures/scale.linear/rotated-85.png new file mode 100644 index 000000000..edf09fae3 Binary files /dev/null and b/test/fixtures/scale.linear/rotated-85.png differ