117 lines
3.6 KiB
JavaScript
117 lines
3.6 KiB
JavaScript
/* *
|
|
*
|
|
* (c) 2016 Highsoft AS
|
|
* Authors: Øystein Moseng, Lars A. V. Cabrera, Jon Arild Nygard
|
|
*
|
|
* License: www.highcharts.com/license
|
|
*
|
|
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
|
*
|
|
* */
|
|
'use strict';
|
|
import U from '../Core/Utilities.js';
|
|
const { error, merge, pick } = U;
|
|
/* *
|
|
*
|
|
* Constants
|
|
*
|
|
* */
|
|
const max = Math.max, min = Math.min;
|
|
/* *
|
|
*
|
|
* Functions
|
|
*
|
|
* */
|
|
/**
|
|
* Calculate margin to place around obstacles for the pathfinder in pixels.
|
|
* Returns a minimum of 1 pixel margin.
|
|
*
|
|
* @deprecated
|
|
* @private
|
|
* @function
|
|
*
|
|
* @param {Array<object>} obstacles
|
|
* Obstacles to calculate margin from.
|
|
*
|
|
* @return {number}
|
|
* The calculated margin in pixels. At least 1.
|
|
*/
|
|
function calculateObstacleMargin(obstacles) {
|
|
const distances = [], len = obstacles.length;
|
|
let obstacleDistance;
|
|
// Go over all obstacles and compare them to the others.
|
|
for (let i = 0; i < len; ++i) {
|
|
// Compare to all obstacles ahead. We will already have compared this
|
|
// obstacle to the ones before.
|
|
for (let j = i + 1; j < len; ++j) {
|
|
obstacleDistance = distance(obstacles[i], obstacles[j]);
|
|
// TODO: Magic number 80
|
|
if (obstacleDistance < 80) { // Ignore large distances
|
|
distances.push(obstacleDistance);
|
|
}
|
|
}
|
|
}
|
|
// Ensure we always have at least one value, even in very spacious charts
|
|
distances.push(80);
|
|
return max(Math.floor(distances.sort((a, b) => (a - b))[
|
|
// Discard first 10% of the relevant distances, and then grab
|
|
// the smallest one.
|
|
Math.floor(distances.length / 10)] / 2 - 1 // Divide the distance by 2 and subtract 1.
|
|
), 1 // 1 is the minimum margin
|
|
);
|
|
}
|
|
/**
|
|
* Compute smallest distance between two rectangles
|
|
* @deprecated
|
|
* @private
|
|
*/
|
|
function distance(a, b, bbMargin) {
|
|
// Count the distance even if we are slightly off
|
|
const margin = pick(bbMargin, 10), yOverlap = a.yMax + margin > b.yMin - margin &&
|
|
a.yMin - margin < b.yMax + margin, xOverlap = a.xMax + margin > b.xMin - margin &&
|
|
a.xMin - margin < b.xMax + margin, xDistance = yOverlap ? (a.xMin > b.xMax ? a.xMin - b.xMax : b.xMin - a.xMax) : Infinity, yDistance = xOverlap ? (a.yMin > b.yMax ? a.yMin - b.yMax : b.yMin - a.yMax) : Infinity;
|
|
// If the rectangles collide, try recomputing with smaller margin.
|
|
// If they collide anyway, discard the obstacle.
|
|
if (xOverlap && yOverlap) {
|
|
return (margin ?
|
|
distance(a, b, Math.floor(margin / 2)) :
|
|
Infinity);
|
|
}
|
|
return min(xDistance, yDistance);
|
|
}
|
|
/**
|
|
* Warn if using legacy options. Copy the options over. Note that this will
|
|
* still break if using the legacy options in chart.update, addSeries etc.
|
|
* @deprecated
|
|
* @private
|
|
*/
|
|
function warnLegacy(chart) {
|
|
if (chart.options.pathfinder ||
|
|
chart.series.reduce(function (acc, series) {
|
|
if (series.options) {
|
|
merge(true, (series.options.connectors = series.options.connectors ||
|
|
{}), series.options.pathfinder);
|
|
}
|
|
return acc || series.options && series.options.pathfinder;
|
|
}, false)) {
|
|
merge(true, (chart.options.connectors = chart.options.connectors || {}), chart.options.pathfinder);
|
|
error('WARNING: Pathfinder options have been renamed. ' +
|
|
'Use "chart.connectors" or "series.connectors" instead.');
|
|
}
|
|
}
|
|
/* *
|
|
*
|
|
* Default Export
|
|
*
|
|
* */
|
|
/**
|
|
* Contains detached legacy code not used anymore after tree shaking.
|
|
* @deprecated
|
|
*/
|
|
const legacy = {
|
|
calculateObstacleMargin,
|
|
distance,
|
|
warnLegacy
|
|
};
|
|
export default legacy;
|