From: etimberg Date: Sat, 26 Nov 2016 17:29:15 +0000 (-0500) Subject: Fix monotone cubic interpolation when two adjacent points are at the exact same x... X-Git-Tag: v2.5.0~1^2~40 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7a8f20e88fb2029e82c9903be99412878368405a;p=thirdparty%2FChart.js.git Fix monotone cubic interpolation when two adjacent points are at the exact same x pixel value --- diff --git a/src/core/core.helpers.js b/src/core/core.helpers.js index 542088f61..506ad9003 100644 --- a/src/core/core.helpers.js +++ b/src/core/core.helpers.js @@ -361,7 +361,10 @@ module.exports = function(Chart) { pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; if (pointAfter && !pointAfter.model.skip) { - pointCurrent.deltaK = (pointAfter.model.y - pointCurrent.model.y) / (pointAfter.model.x - pointCurrent.model.x); + var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); + + // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 + pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; } if (!pointBefore || pointBefore.model.skip) { diff --git a/test/core.helpers.tests.js b/test/core.helpers.tests.js index 4cd200ae3..75e0baf90 100644 --- a/test/core.helpers.tests.js +++ b/test/core.helpers.tests.js @@ -412,6 +412,7 @@ describe('Core helper tests', function() { {_model: {x: 27, y: 125, skip: false}}, {_model: {x: 30, y: 105, skip: false}}, {_model: {x: 33, y: 110, skip: false}}, + {_model: {x: 33, y: 110, skip: false}}, {_model: {x: 36, y: 170, skip: false}} ]; helpers.splineCurveMonotone(dataPoints); @@ -532,9 +533,20 @@ describe('Core helper tests', function() { y: 110, skip: false, controlPointPreviousX: 32, - controlPointPreviousY: 105, + controlPointPreviousY: 110, + controlPointNextX: 33, + controlPointNextY: 110 + } + }, + { + _model: { + x: 33, + y: 110, + skip: false, + controlPointPreviousX: 33, + controlPointPreviousY: 110, controlPointNextX: 34, - controlPointNextY: 115 + controlPointNextY: 110 } }, {