%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
/* *
*
* Networkgraph series
*
* (c) 2010-2021 Paweł Fus
*
* License: www.highcharts.com/license
*
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
*
* */
'use strict';
import QuadTreeNode from './QuadTreeNode.js';
/* *
*
* Class
*
* */
/**
* The QuadTree class. Used in Networkgraph chart as a base for Barnes-Hut
* approximation.
*
* @private
* @class
* @name Highcharts.QuadTree
*
* @param {number} x
* Left position of the plotting area
* @param {number} y
* Top position of the plotting area
* @param {number} width
* Width of the plotting area
* @param {number} height
* Height of the plotting area
*/
var QuadTree = /** @class */ (function () {
/* *
*
* Constructor
*
* */
function QuadTree(x, y, width, height) {
// Boundary rectangle:
this.box = {
left: x,
top: y,
width: width,
height: height
};
this.maxDepth = 25;
this.root = new QuadTreeNode(this.box);
this.root.isInternal = true;
this.root.isRoot = true;
this.root.divideBox();
}
/* *
*
* Functions
*
* */
/**
* Calculate mass of the each QuadNode in the tree.
*/
QuadTree.prototype.calculateMassAndCenter = function () {
this.visitNodeRecursive(null, null, function (node) {
node.updateMassAndCenter();
});
};
/**
* Insert nodes into the QuadTree
*
* @param {Array<Highcharts.Point>} points
* Points as nodes
*/
QuadTree.prototype.insertNodes = function (points) {
for (var _i = 0, points_1 = points; _i < points_1.length; _i++) {
var point = points_1[_i];
this.root.insert(point, this.maxDepth);
}
};
/**
* Depfth first treversal (DFS). Using `before` and `after` callbacks,
* we can get two results: preorder and postorder traversals, reminder:
*
* ```
* (a)
* / \
* (b) (c)
* / \
* (d) (e)
* ```
*
* DFS (preorder): `a -> b -> d -> e -> c`
*
* DFS (postorder): `d -> e -> b -> c -> a`
*
* @param {Highcharts.QuadTreeNode|null} node
* QuadTree node
* @param {Function} [beforeCallback]
* Function to be called before visiting children nodes.
* @param {Function} [afterCallback]
* Function to be called after visiting children nodes.
*/
QuadTree.prototype.visitNodeRecursive = function (node, beforeCallback, afterCallback) {
var goFurther;
if (!node) {
node = this.root;
}
if (node === this.root && beforeCallback) {
goFurther = beforeCallback(node);
}
if (goFurther === false) {
return;
}
for (var _i = 0, _a = node.nodes; _i < _a.length; _i++) {
var qtNode = _a[_i];
if (qtNode.isInternal) {
if (beforeCallback) {
goFurther = beforeCallback(qtNode);
}
if (goFurther === false) {
continue;
}
this.visitNodeRecursive(qtNode, beforeCallback, afterCallback);
}
else if (qtNode.body) {
if (beforeCallback) {
beforeCallback(qtNode.body);
}
}
if (afterCallback) {
afterCallback(qtNode);
}
}
if (node === this.root && afterCallback) {
afterCallback(node);
}
};
return QuadTree;
}());
/* *
*
* Default Export
*
* */
export default QuadTree;