vis-graph3d
Version:
Create interactive, animated 3d graphs. Surfaces, lines, dots and block styling out of the box.
1 lines • 268 kB
Source Map (JSON)
{"version":3,"file":"vis-graph3d.mjs","sources":["../../lib/graph3d/Point3d.js","../../lib/graph3d/Point2d.js","../../lib/graph3d/Slider.js","../../lib/graph3d/StepNumber.js","../../lib/graph3d/Camera.js","../../lib/graph3d/Settings.js","../../lib/graph3d/options.js","../../lib/graph3d/Range.js","../../lib/graph3d/Filter.js","../../lib/graph3d/DataGroup.js","../../lib/graph3d/Graph3d.js"],"sourcesContent":["/**\n * @param {number} [x]\n * @param {number} [y]\n * @param {number} [z]\n */\nfunction Point3d(x, y, z) {\n this.x = x !== undefined ? x : 0;\n this.y = y !== undefined ? y : 0;\n this.z = z !== undefined ? z : 0;\n}\n\n/**\n * Subtract the two provided points, returns a-b\n * @param {Point3d} a\n * @param {Point3d} b\n * @returns {Point3d} a-b\n */\nPoint3d.subtract = function (a, b) {\n const sub = new Point3d();\n sub.x = a.x - b.x;\n sub.y = a.y - b.y;\n sub.z = a.z - b.z;\n return sub;\n};\n\n/**\n * Add the two provided points, returns a+b\n * @param {Point3d} a\n * @param {Point3d} b\n * @returns {Point3d} a+b\n */\nPoint3d.add = function (a, b) {\n const sum = new Point3d();\n sum.x = a.x + b.x;\n sum.y = a.y + b.y;\n sum.z = a.z + b.z;\n return sum;\n};\n\n/**\n * Calculate the average of two 3d points\n * @param {Point3d} a\n * @param {Point3d} b\n * @returns {Point3d} The average, (a+b)/2\n */\nPoint3d.avg = function (a, b) {\n return new Point3d((a.x + b.x) / 2, (a.y + b.y) / 2, (a.z + b.z) / 2);\n};\n\n/**\n * Scale the provided point by a scalar, returns p*c\n * @param {Point3d} p\n * @param {number} c\n * @returns {Point3d} p*c\n */\nPoint3d.scalarProduct = function (p, c) {\n return new Point3d(p.x * c, p.y * c, p.z * c);\n};\n\n/**\n * Calculate the dot product of the two provided points, returns a.b\n * Documentation: http://en.wikipedia.org/wiki/Dot_product\n * @param {Point3d} a\n * @param {Point3d} b\n * @returns {Point3d} dot product a.b\n */\nPoint3d.dotProduct = function (a, b) {\n return a.x * b.x + a.y * b.y + a.z * b.z;\n};\n\n/**\n * Calculate the cross product of the two provided points, returns axb\n * Documentation: http://en.wikipedia.org/wiki/Cross_product\n * @param {Point3d} a\n * @param {Point3d} b\n * @returns {Point3d} cross product axb\n */\nPoint3d.crossProduct = function (a, b) {\n const crossproduct = new Point3d();\n\n crossproduct.x = a.y * b.z - a.z * b.y;\n crossproduct.y = a.z * b.x - a.x * b.z;\n crossproduct.z = a.x * b.y - a.y * b.x;\n\n return crossproduct;\n};\n\n/**\n * Retrieve the length of the vector (or the distance from this point to the origin\n * @returns {number} length\n */\nPoint3d.prototype.length = function () {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n};\n\n/**\n * Return a normalized vector pointing in the same direction.\n * @returns {Point3d} normalized\n */\nPoint3d.prototype.normalize = function () {\n return Point3d.scalarProduct(this, 1 / this.length());\n};\n\nexport default Point3d;\n","/**\n * @param {number} [x]\n * @param {number} [y]\n */\nfunction Point2d(x, y) {\n this.x = x !== undefined ? x : 0;\n this.y = y !== undefined ? y : 0;\n}\n\nexport default Point2d;\n","import * as util from \"vis-util/esnext\";\n\n/**\n * An html slider control with start/stop/prev/next buttons\n * @function Object() { [native code] } Slider\n * @param {Element} container The element where the slider will be created\n * @param {object} options Available options:\n * {boolean} visible If true (default) the\n * slider is visible.\n */\nfunction Slider(container, options) {\n if (container === undefined) {\n throw new Error(\"No container element defined\");\n }\n this.container = container;\n this.visible =\n options && options.visible != undefined ? options.visible : true;\n\n if (this.visible) {\n this.frame = document.createElement(\"DIV\");\n //this.frame.style.backgroundColor = '#E5E5E5';\n this.frame.style.width = \"100%\";\n this.frame.style.position = \"relative\";\n this.container.appendChild(this.frame);\n\n this.frame.prev = document.createElement(\"INPUT\");\n this.frame.prev.type = \"BUTTON\";\n this.frame.prev.value = \"Prev\";\n this.frame.appendChild(this.frame.prev);\n\n this.frame.play = document.createElement(\"INPUT\");\n this.frame.play.type = \"BUTTON\";\n this.frame.play.value = \"Play\";\n this.frame.appendChild(this.frame.play);\n\n this.frame.next = document.createElement(\"INPUT\");\n this.frame.next.type = \"BUTTON\";\n this.frame.next.value = \"Next\";\n this.frame.appendChild(this.frame.next);\n\n this.frame.bar = document.createElement(\"INPUT\");\n this.frame.bar.type = \"BUTTON\";\n this.frame.bar.style.position = \"absolute\";\n this.frame.bar.style.border = \"1px solid red\";\n this.frame.bar.style.width = \"100px\";\n this.frame.bar.style.height = \"6px\";\n this.frame.bar.style.borderRadius = \"2px\";\n this.frame.bar.style.MozBorderRadius = \"2px\";\n this.frame.bar.style.border = \"1px solid #7F7F7F\";\n this.frame.bar.style.backgroundColor = \"#E5E5E5\";\n this.frame.appendChild(this.frame.bar);\n\n this.frame.slide = document.createElement(\"INPUT\");\n this.frame.slide.type = \"BUTTON\";\n this.frame.slide.style.margin = \"0px\";\n this.frame.slide.value = \" \";\n this.frame.slide.style.position = \"relative\";\n this.frame.slide.style.left = \"-100px\";\n this.frame.appendChild(this.frame.slide);\n\n // create events\n const me = this;\n this.frame.slide.onmousedown = function (event) {\n me._onMouseDown(event);\n };\n this.frame.prev.onclick = function (event) {\n me.prev(event);\n };\n this.frame.play.onclick = function (event) {\n me.togglePlay(event);\n };\n this.frame.next.onclick = function (event) {\n me.next(event);\n };\n }\n\n this.onChangeCallback = undefined;\n\n this.values = [];\n this.index = undefined;\n\n this.playTimeout = undefined;\n this.playInterval = 1000; // milliseconds\n this.playLoop = true;\n}\n\n/**\n * Select the previous index\n */\nSlider.prototype.prev = function () {\n let index = this.getIndex();\n if (index > 0) {\n index--;\n this.setIndex(index);\n }\n};\n\n/**\n * Select the next index\n */\nSlider.prototype.next = function () {\n let index = this.getIndex();\n if (index < this.values.length - 1) {\n index++;\n this.setIndex(index);\n }\n};\n\n/**\n * Select the next index\n */\nSlider.prototype.playNext = function () {\n const start = new Date();\n\n let index = this.getIndex();\n if (index < this.values.length - 1) {\n index++;\n this.setIndex(index);\n } else if (this.playLoop) {\n // jump to the start\n index = 0;\n this.setIndex(index);\n }\n\n const end = new Date();\n const diff = end - start;\n\n // calculate how much time it to to set the index and to execute the callback\n // function.\n const interval = Math.max(this.playInterval - diff, 0);\n // document.title = diff // TODO: cleanup\n\n const me = this;\n this.playTimeout = setTimeout(function () {\n me.playNext();\n }, interval);\n};\n\n/**\n * Toggle start or stop playing\n */\nSlider.prototype.togglePlay = function () {\n if (this.playTimeout === undefined) {\n this.play();\n } else {\n this.stop();\n }\n};\n\n/**\n * Start playing\n */\nSlider.prototype.play = function () {\n // Test whether already playing\n if (this.playTimeout) return;\n\n this.playNext();\n\n if (this.frame) {\n this.frame.play.value = \"Stop\";\n }\n};\n\n/**\n * Stop playing\n */\nSlider.prototype.stop = function () {\n clearInterval(this.playTimeout);\n this.playTimeout = undefined;\n\n if (this.frame) {\n this.frame.play.value = \"Play\";\n }\n};\n\n/**\n * Set a callback function which will be triggered when the value of the\n * slider bar has changed.\n * @param {Function} callback\n */\nSlider.prototype.setOnChangeCallback = function (callback) {\n this.onChangeCallback = callback;\n};\n\n/**\n * Set the interval for playing the list\n * @param {number} interval The interval in milliseconds\n */\nSlider.prototype.setPlayInterval = function (interval) {\n this.playInterval = interval;\n};\n\n/**\n * Retrieve the current play interval\n * @returns {number} interval The interval in milliseconds\n */\nSlider.prototype.getPlayInterval = function () {\n return this.playInterval;\n};\n\n/**\n * Set looping on or off\n * @param {boolean} doLoop If true, the slider will jump to the start when\n * the end is passed, and will jump to the end\n * when the start is passed.\n */\nSlider.prototype.setPlayLoop = function (doLoop) {\n this.playLoop = doLoop;\n};\n\n/**\n * Execute the onchange callback function\n */\nSlider.prototype.onChange = function () {\n if (this.onChangeCallback !== undefined) {\n this.onChangeCallback();\n }\n};\n\n/**\n * redraw the slider on the correct place\n */\nSlider.prototype.redraw = function () {\n if (this.frame) {\n // resize the bar\n this.frame.bar.style.top =\n this.frame.clientHeight / 2 - this.frame.bar.offsetHeight / 2 + \"px\";\n this.frame.bar.style.width =\n this.frame.clientWidth -\n this.frame.prev.clientWidth -\n this.frame.play.clientWidth -\n this.frame.next.clientWidth -\n 30 +\n \"px\";\n\n // position the slider button\n const left = this.indexToLeft(this.index);\n this.frame.slide.style.left = left + \"px\";\n }\n};\n\n/**\n * Set the list with values for the slider\n * @param {Array} values A javascript array with values (any type)\n */\nSlider.prototype.setValues = function (values) {\n this.values = values;\n\n if (this.values.length > 0) this.setIndex(0);\n else this.index = undefined;\n};\n\n/**\n * Select a value by its index\n * @param {number} index\n */\nSlider.prototype.setIndex = function (index) {\n if (index < this.values.length) {\n this.index = index;\n\n this.redraw();\n this.onChange();\n } else {\n throw new Error(\"Index out of range\");\n }\n};\n\n/**\n * retrieve the index of the currently selected vaue\n * @returns {number} index\n */\nSlider.prototype.getIndex = function () {\n return this.index;\n};\n\n/**\n * retrieve the currently selected value\n * @returns {*} value\n */\nSlider.prototype.get = function () {\n return this.values[this.index];\n};\n\nSlider.prototype._onMouseDown = function (event) {\n // only react on left mouse button down\n const leftButtonDown = event.which ? event.which === 1 : event.button === 1;\n if (!leftButtonDown) return;\n\n this.startClientX = event.clientX;\n this.startSlideX = parseFloat(this.frame.slide.style.left);\n\n this.frame.style.cursor = \"move\";\n\n // add event listeners to handle moving the contents\n // we store the function onmousemove and onmouseup in the graph, so we can\n // remove the eventlisteners lateron in the function mouseUp()\n const me = this;\n this.onmousemove = function (event) {\n me._onMouseMove(event);\n };\n this.onmouseup = function (event) {\n me._onMouseUp(event);\n };\n document.addEventListener(\"mousemove\", this.onmousemove);\n document.addEventListener(\"mouseup\", this.onmouseup);\n util.preventDefault(event);\n};\n\nSlider.prototype.leftToIndex = function (left) {\n const width =\n parseFloat(this.frame.bar.style.width) - this.frame.slide.clientWidth - 10;\n const x = left - 3;\n\n let index = Math.round((x / width) * (this.values.length - 1));\n if (index < 0) index = 0;\n if (index > this.values.length - 1) index = this.values.length - 1;\n\n return index;\n};\n\nSlider.prototype.indexToLeft = function (index) {\n const width =\n parseFloat(this.frame.bar.style.width) - this.frame.slide.clientWidth - 10;\n\n const x = (index / (this.values.length - 1)) * width;\n const left = x + 3;\n\n return left;\n};\n\nSlider.prototype._onMouseMove = function (event) {\n const diff = event.clientX - this.startClientX;\n const x = this.startSlideX + diff;\n\n const index = this.leftToIndex(x);\n\n this.setIndex(index);\n\n util.preventDefault();\n};\n\nSlider.prototype._onMouseUp = function () {\n this.frame.style.cursor = \"auto\";\n\n // remove event listeners\n document.removeEventListener(\"mousemove\", this.onmousemove);\n document.removeEventListener(\"mouseup\", this.onmouseup);\n\n util.preventDefault();\n};\n\nexport default Slider;\n","/**\n * The class StepNumber is an iterator for Numbers. You provide a start and end\n * value, and a best step size. StepNumber itself rounds to fixed values and\n * a finds the step that best fits the provided step.\n *\n * If prettyStep is true, the step size is chosen as close as possible to the\n * provided step, but being a round value like 1, 2, 5, 10, 20, 50, ....\n *\n * Example usage:\n * var step = new StepNumber(0, 10, 2.5, true);\n * step.start();\n * while (!step.end()) {\n * alert(step.getCurrent());\n * step.next();\n * }\n *\n * Version: 1.0\n * @param {number} start The start value\n * @param {number} end The end value\n * @param {number} step Optional. Step size. Must be a positive value.\n * @param {boolean} prettyStep Optional. If true, the step size is rounded\n * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...)\n */\nfunction StepNumber(start, end, step, prettyStep) {\n // set default values\n this._start = 0;\n this._end = 0;\n this._step = 1;\n this.prettyStep = true;\n this.precision = 5;\n\n this._current = 0;\n this.setRange(start, end, step, prettyStep);\n}\n\n/**\n * Check for input values, to prevent disasters from happening\n *\n * Source: http://stackoverflow.com/a/1830844\n * @param {string} n\n * @returns {boolean}\n */\nStepNumber.prototype.isNumeric = function (n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n};\n\n/**\n * Set a new range: start, end and step.\n * @param {number} start The start value\n * @param {number} end The end value\n * @param {number} step Optional. Step size. Must be a positive value.\n * @param {boolean} prettyStep Optional. If true, the step size is rounded\n * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...)\n */\nStepNumber.prototype.setRange = function (start, end, step, prettyStep) {\n if (!this.isNumeric(start)) {\n throw new Error(\"Parameter 'start' is not numeric; value: \" + start);\n }\n if (!this.isNumeric(end)) {\n throw new Error(\"Parameter 'end' is not numeric; value: \" + start);\n }\n if (!this.isNumeric(step)) {\n throw new Error(\"Parameter 'step' is not numeric; value: \" + start);\n }\n\n this._start = start ? start : 0;\n this._end = end ? end : 0;\n\n this.setStep(step, prettyStep);\n};\n\n/**\n * Set a new step size\n * @param {number} step New step size. Must be a positive value\n * @param {boolean} prettyStep Optional. If true, the provided step is rounded\n * to a pretty step size (like 1, 2, 5, 10, 20, 50, ...)\n */\nStepNumber.prototype.setStep = function (step, prettyStep) {\n if (step === undefined || step <= 0) return;\n\n if (prettyStep !== undefined) this.prettyStep = prettyStep;\n\n if (this.prettyStep === true)\n this._step = StepNumber.calculatePrettyStep(step);\n else this._step = step;\n};\n\n/**\n * Calculate a nice step size, closest to the desired step size.\n * Returns a value in one of the ranges 1*10^n, 2*10^n, or 5*10^n, where n is an\n * integer Number. For example 1, 2, 5, 10, 20, 50, etc...\n * @param {number} step Desired step size\n * @returns {number} Nice step size\n */\nStepNumber.calculatePrettyStep = function (step) {\n const log10 = function (x) {\n return Math.log(x) / Math.LN10;\n };\n\n // try three steps (multiple of 1, 2, or 5\n const step1 = Math.pow(10, Math.round(log10(step))),\n step2 = 2 * Math.pow(10, Math.round(log10(step / 2))),\n step5 = 5 * Math.pow(10, Math.round(log10(step / 5)));\n\n // choose the best step (closest to minimum step)\n let prettyStep = step1;\n if (Math.abs(step2 - step) <= Math.abs(prettyStep - step)) prettyStep = step2;\n if (Math.abs(step5 - step) <= Math.abs(prettyStep - step)) prettyStep = step5;\n\n // for safety\n if (prettyStep <= 0) {\n prettyStep = 1;\n }\n\n return prettyStep;\n};\n\n/**\n * returns the current value of the step\n * @returns {number} current value\n */\nStepNumber.prototype.getCurrent = function () {\n return parseFloat(this._current.toPrecision(this.precision));\n};\n\n/**\n * returns the current step size\n * @returns {number} current step size\n */\nStepNumber.prototype.getStep = function () {\n return this._step;\n};\n\n/**\n * Set the current to its starting value.\n *\n * By default, this will be the largest value smaller than start, which\n * is a multiple of the step size.\n *\n * Parameters checkFirst is optional, default false.\n * If set to true, move the current value one step if smaller than start.\n * @param {boolean} [checkFirst]\n */\nStepNumber.prototype.start = function (checkFirst) {\n if (checkFirst === undefined) {\n checkFirst = false;\n }\n\n this._current = this._start - (this._start % this._step);\n\n if (checkFirst) {\n if (this.getCurrent() < this._start) {\n this.next();\n }\n }\n};\n\n/**\n * Do a step, add the step size to the current value\n */\nStepNumber.prototype.next = function () {\n this._current += this._step;\n};\n\n/**\n * Returns true whether the end is reached\n * @returns {boolean} True if the current value has passed the end value.\n */\nStepNumber.prototype.end = function () {\n return this._current > this._end;\n};\n\nexport default StepNumber;\n","import Point3d from \"./Point3d.js\";\n\n/**\n * The camera is mounted on a (virtual) camera arm. The camera arm can rotate\n * The camera is always looking in the direction of the origin of the arm.\n * This way, the camera always rotates around one fixed point, the location\n * of the camera arm.\n *\n * Documentation:\n * http://en.wikipedia.org/wiki/3D_projection\n * @class Camera\n */\nfunction Camera() {\n this.armLocation = new Point3d();\n this.armRotation = {};\n this.armRotation.horizontal = 0;\n this.armRotation.vertical = 0;\n this.armLength = 1.7;\n this.cameraOffset = new Point3d();\n this.offsetMultiplier = 0.6;\n\n this.cameraLocation = new Point3d();\n this.cameraRotation = new Point3d(0.5 * Math.PI, 0, 0);\n\n this.calculateCameraOrientation();\n}\n\n/**\n * Set offset camera in camera coordinates\n * @param {number} x offset by camera horisontal\n * @param {number} y offset by camera vertical\n */\nCamera.prototype.setOffset = function (x, y) {\n const abs = Math.abs,\n sign = Math.sign,\n mul = this.offsetMultiplier,\n border = this.armLength * mul;\n\n if (abs(x) > border) {\n x = sign(x) * border;\n }\n if (abs(y) > border) {\n y = sign(y) * border;\n }\n this.cameraOffset.x = x;\n this.cameraOffset.y = y;\n this.calculateCameraOrientation();\n};\n\n/**\n * Get camera offset by horizontal and vertical\n * @returns {number}\n */\nCamera.prototype.getOffset = function () {\n return this.cameraOffset;\n};\n\n/**\n * Set the location (origin) of the arm\n * @param {number} x Normalized value of x\n * @param {number} y Normalized value of y\n * @param {number} z Normalized value of z\n */\nCamera.prototype.setArmLocation = function (x, y, z) {\n this.armLocation.x = x;\n this.armLocation.y = y;\n this.armLocation.z = z;\n\n this.calculateCameraOrientation();\n};\n\n/**\n * Set the rotation of the camera arm\n * @param {number} horizontal The horizontal rotation, between 0 and 2*PI.\n * Optional, can be left undefined.\n * @param {number} vertical The vertical rotation, between 0 and 0.5*PI\n * if vertical=0.5*PI, the graph is shown from the\n * top. Optional, can be left undefined.\n */\nCamera.prototype.setArmRotation = function (horizontal, vertical) {\n if (horizontal !== undefined) {\n this.armRotation.horizontal = horizontal;\n }\n\n if (vertical !== undefined) {\n this.armRotation.vertical = vertical;\n if (this.armRotation.vertical < 0) this.armRotation.vertical = 0;\n if (this.armRotation.vertical > 0.5 * Math.PI)\n this.armRotation.vertical = 0.5 * Math.PI;\n }\n\n if (horizontal !== undefined || vertical !== undefined) {\n this.calculateCameraOrientation();\n }\n};\n\n/**\n * Retrieve the current arm rotation\n * @returns {object} An object with parameters horizontal and vertical\n */\nCamera.prototype.getArmRotation = function () {\n const rot = {};\n rot.horizontal = this.armRotation.horizontal;\n rot.vertical = this.armRotation.vertical;\n\n return rot;\n};\n\n/**\n * Set the (normalized) length of the camera arm.\n * @param {number} length A length between 0.71 and 5.0\n */\nCamera.prototype.setArmLength = function (length) {\n if (length === undefined) return;\n\n this.armLength = length;\n\n // Radius must be larger than the corner of the graph,\n // which has a distance of sqrt(0.5^2+0.5^2) = 0.71 from the center of the\n // graph\n if (this.armLength < 0.71) this.armLength = 0.71;\n if (this.armLength > 5.0) this.armLength = 5.0;\n\n this.setOffset(this.cameraOffset.x, this.cameraOffset.y);\n this.calculateCameraOrientation();\n};\n\n/**\n * Retrieve the arm length\n * @returns {number} length\n */\nCamera.prototype.getArmLength = function () {\n return this.armLength;\n};\n\n/**\n * Retrieve the camera location\n * @returns {Point3d} cameraLocation\n */\nCamera.prototype.getCameraLocation = function () {\n return this.cameraLocation;\n};\n\n/**\n * Retrieve the camera rotation\n * @returns {Point3d} cameraRotation\n */\nCamera.prototype.getCameraRotation = function () {\n return this.cameraRotation;\n};\n\n/**\n * Calculate the location and rotation of the camera based on the\n * position and orientation of the camera arm\n */\nCamera.prototype.calculateCameraOrientation = function () {\n // calculate location of the camera\n this.cameraLocation.x =\n this.armLocation.x -\n this.armLength *\n Math.sin(this.armRotation.horizontal) *\n Math.cos(this.armRotation.vertical);\n this.cameraLocation.y =\n this.armLocation.y -\n this.armLength *\n Math.cos(this.armRotation.horizontal) *\n Math.cos(this.armRotation.vertical);\n this.cameraLocation.z =\n this.armLocation.z + this.armLength * Math.sin(this.armRotation.vertical);\n\n // calculate rotation of the camera\n this.cameraRotation.x = Math.PI / 2 - this.armRotation.vertical;\n this.cameraRotation.y = 0;\n this.cameraRotation.z = -this.armRotation.horizontal;\n\n const xa = this.cameraRotation.x;\n const za = this.cameraRotation.z;\n const dx = this.cameraOffset.x;\n const dy = this.cameraOffset.y;\n const sin = Math.sin,\n cos = Math.cos;\n\n this.cameraLocation.x =\n this.cameraLocation.x + dx * cos(za) + dy * -sin(za) * cos(xa);\n this.cameraLocation.y =\n this.cameraLocation.y + dx * sin(za) + dy * cos(za) * cos(xa);\n this.cameraLocation.z = this.cameraLocation.z + dy * sin(xa);\n};\n\nexport default Camera;\n","////////////////////////////////////////////////////////////////////////////////\n// This modules handles the options for Graph3d.\n//\n////////////////////////////////////////////////////////////////////////////////\nimport * as util from \"vis-util/esnext\";\nimport Camera from \"./Camera.js\";\nimport Point3d from \"./Point3d.js\";\n\n// enumerate the available styles\nconst STYLE = {\n BAR: 0,\n BARCOLOR: 1,\n BARSIZE: 2,\n DOT: 3,\n DOTLINE: 4,\n DOTCOLOR: 5,\n DOTSIZE: 6,\n GRID: 7,\n LINE: 8,\n SURFACE: 9,\n};\n\n// The string representations of the styles\nconst STYLENAME = {\n dot: STYLE.DOT,\n \"dot-line\": STYLE.DOTLINE,\n \"dot-color\": STYLE.DOTCOLOR,\n \"dot-size\": STYLE.DOTSIZE,\n line: STYLE.LINE,\n grid: STYLE.GRID,\n surface: STYLE.SURFACE,\n bar: STYLE.BAR,\n \"bar-color\": STYLE.BARCOLOR,\n \"bar-size\": STYLE.BARSIZE,\n};\n\n/**\n * Field names in the options hash which are of relevance to the user.\n *\n * Specifically, these are the fields which require no special handling,\n * and can be directly copied over.\n */\nconst OPTIONKEYS = [\n \"width\",\n \"height\",\n \"filterLabel\",\n \"legendLabel\",\n \"xLabel\",\n \"yLabel\",\n \"zLabel\",\n \"xValueLabel\",\n \"yValueLabel\",\n \"zValueLabel\",\n \"showXAxis\",\n \"showYAxis\",\n \"showZAxis\",\n \"showGrayBottom\",\n \"showGrid\",\n \"showPerspective\",\n \"showShadow\",\n \"showSurfaceGrid\",\n \"keepAspectRatio\",\n \"rotateAxisLabels\",\n \"verticalRatio\",\n \"dotSizeRatio\",\n \"dotSizeMinFraction\",\n \"dotSizeMaxFraction\",\n \"showAnimationControls\",\n \"animationInterval\",\n \"animationPreload\",\n \"animationAutoStart\",\n \"axisColor\",\n \"axisFontSize\",\n \"axisFontType\",\n \"gridColor\",\n \"xCenter\",\n \"yCenter\",\n \"zoomable\",\n \"tooltipDelay\",\n \"ctrlToZoom\",\n];\n\n/**\n * Field names in the options hash which are of relevance to the user.\n *\n * Same as OPTIONKEYS, but internally these fields are stored with\n * prefix 'default' in the name.\n */\nconst PREFIXEDOPTIONKEYS = [\n \"xBarWidth\",\n \"yBarWidth\",\n \"valueMin\",\n \"valueMax\",\n \"xMin\",\n \"xMax\",\n \"xStep\",\n \"yMin\",\n \"yMax\",\n \"yStep\",\n \"zMin\",\n \"zMax\",\n \"zStep\",\n];\n\n// Placeholder for DEFAULTS reference\nlet DEFAULTS = undefined;\n\n/**\n * Check if given hash is empty.\n *\n * Source: http://stackoverflow.com/a/679937\n * @param {object} obj\n * @returns {boolean}\n */\nfunction isEmpty(obj) {\n for (const prop in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, prop)) return false;\n }\n\n return true;\n}\n\n/**\n * Make first letter of parameter upper case.\n *\n * Source: http://stackoverflow.com/a/1026087\n * @param {string} str\n * @returns {string}\n */\nfunction capitalize(str) {\n if (str === undefined || str === \"\" || typeof str != \"string\") {\n return str;\n }\n\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Add a prefix to a field name, taking style guide into account\n * @param {string} prefix\n * @param {string} fieldName\n * @returns {string}\n */\nfunction prefixFieldName(prefix, fieldName) {\n if (prefix === undefined || prefix === \"\") {\n return fieldName;\n }\n\n return prefix + capitalize(fieldName);\n}\n\n/**\n * Forcibly copy fields from src to dst in a controlled manner.\n *\n * A given field in dst will always be overwitten. If this field\n * is undefined or not present in src, the field in dst will\n * be explicitly set to undefined.\n *\n * The intention here is to be able to reset all option fields.\n *\n * Only the fields mentioned in array 'fields' will be handled.\n * @param {object} src\n * @param {object} dst\n * @param {Array<string>} fields array with names of fields to copy\n * @param {string} [prefix] prefix to use for the target fields.\n */\nfunction forceCopy(src, dst, fields, prefix) {\n let srcKey;\n let dstKey;\n\n for (let i = 0; i < fields.length; ++i) {\n srcKey = fields[i];\n dstKey = prefixFieldName(prefix, srcKey);\n\n dst[dstKey] = src[srcKey];\n }\n}\n\n/**\n * Copy fields from src to dst in a safe and controlled manner.\n *\n * Only the fields mentioned in array 'fields' will be copied over,\n * and only if these are actually defined.\n * @param {object} src\n * @param {object} dst\n * @param {Array<string>} fields array with names of fields to copy\n * @param {string} [prefix] prefix to use for the target fields.\n */\nfunction safeCopy(src, dst, fields, prefix) {\n let srcKey;\n let dstKey;\n\n for (let i = 0; i < fields.length; ++i) {\n srcKey = fields[i];\n if (src[srcKey] === undefined) continue;\n\n dstKey = prefixFieldName(prefix, srcKey);\n\n dst[dstKey] = src[srcKey];\n }\n}\n\n/**\n * Initialize dst with the values in src.\n *\n * src is the hash with the default values.\n * A reference DEFAULTS to this hash is stored locally for\n * further handling.\n *\n * For now, dst is assumed to be a Graph3d instance.\n * @param {object} src\n * @param {object} dst\n */\nfunction setDefaults(src, dst) {\n if (src === undefined || isEmpty(src)) {\n throw new Error(\"No DEFAULTS passed\");\n }\n if (dst === undefined) {\n throw new Error(\"No dst passed\");\n }\n\n // Remember defaults for future reference\n DEFAULTS = src;\n\n // Handle the defaults which can be simply copied over\n forceCopy(src, dst, OPTIONKEYS);\n forceCopy(src, dst, PREFIXEDOPTIONKEYS, \"default\");\n\n // Handle the more complex ('special') fields\n setSpecialSettings(src, dst);\n\n // Following are internal fields, not part of the user settings\n dst.margin = 10; // px\n dst.showTooltip = false;\n dst.onclick_callback = null;\n dst.eye = new Point3d(0, 0, -1); // TODO: set eye.z about 3/4 of the width of the window?\n}\n\n/**\n *\n * @param {object} options\n * @param {object} dst\n */\nfunction setOptions(options, dst) {\n if (options === undefined) {\n return;\n }\n if (dst === undefined) {\n throw new Error(\"No dst passed\");\n }\n\n if (DEFAULTS === undefined || isEmpty(DEFAULTS)) {\n throw new Error(\"DEFAULTS not set for module Settings\");\n }\n\n // Handle the parameters which can be simply copied over\n safeCopy(options, dst, OPTIONKEYS);\n safeCopy(options, dst, PREFIXEDOPTIONKEYS, \"default\");\n\n // Handle the more complex ('special') fields\n setSpecialSettings(options, dst);\n}\n\n/**\n * Special handling for certain parameters\n *\n * 'Special' here means: setting requires more than a simple copy\n * @param {object} src\n * @param {object} dst\n */\nfunction setSpecialSettings(src, dst) {\n if (src.backgroundColor !== undefined) {\n setBackgroundColor(src.backgroundColor, dst);\n }\n\n setDataColor(src.dataColor, dst);\n setStyle(src.style, dst);\n if (src.surfaceColors !== undefined) {\n console.warn(\n \"`options.surfaceColors` is deprecated and may be removed in a future \" +\n \"version. Please use `options.colormap` instead. Note that the `colormap` \" +\n \"option uses the inverse array ordering (running from vMin to vMax).\",\n );\n if (src.colormap !== undefined) {\n throw new Error(\n \"The `colormap` and `surfaceColors` options are mutually exclusive.\",\n );\n }\n if (dst.style !== \"surface\") {\n console.warn(\n \"Ignoring `surfaceColors` in graph style `\" +\n dst.style +\n \"` for \" +\n \"backward compatibility (only effective in `surface` plots).\",\n );\n } else {\n setSurfaceColor(src.surfaceColors, dst);\n }\n } else {\n setColormap(src.colormap, dst);\n }\n setShowLegend(src.showLegend, dst);\n setCameraPosition(src.cameraPosition, dst);\n\n // As special fields go, this is an easy one; just a translation of the name.\n // Can't use this.tooltip directly, because that field exists internally\n if (src.tooltip !== undefined) {\n dst.showTooltip = src.tooltip;\n }\n if (src.onclick != undefined) {\n dst.onclick_callback = src.onclick;\n console.warn(\n \"`options.onclick` is deprecated and may be removed in a future version.\" +\n \" Please use `Graph3d.on('click', handler)` instead.\",\n );\n }\n\n if (src.tooltipStyle !== undefined) {\n util.selectiveDeepExtend([\"tooltipStyle\"], dst, src);\n }\n}\n\n/**\n * Set the value of setting 'showLegend'\n *\n * This depends on the value of the style fields, so it must be called\n * after the style field has been initialized.\n * @param {boolean} showLegend\n * @param {object} dst\n */\nfunction setShowLegend(showLegend, dst) {\n if (showLegend === undefined) {\n // If the default was auto, make a choice for this field\n const isAutoByDefault = DEFAULTS.showLegend === undefined;\n\n if (isAutoByDefault) {\n // these styles default to having legends\n const isLegendGraphStyle =\n dst.style === STYLE.DOTCOLOR || dst.style === STYLE.DOTSIZE;\n\n dst.showLegend = isLegendGraphStyle;\n } else {\n // Leave current value as is\n }\n } else {\n dst.showLegend = showLegend;\n }\n}\n\n/**\n * Retrieve the style index from given styleName\n * @param {string} styleName Style name such as 'dot', 'grid', 'dot-line'\n * @returns {number} styleNumber Enumeration value representing the style, or -1\n * when not found\n */\nfunction getStyleNumberByName(styleName) {\n const number = STYLENAME[styleName];\n\n if (number === undefined) {\n return -1;\n }\n\n return number;\n}\n\n/**\n * Check if given number is a valid style number.\n * @param {string | number} style\n * @returns {boolean} true if valid, false otherwise\n */\nfunction checkStyleNumber(style) {\n let valid = false;\n\n for (const n in STYLE) {\n if (STYLE[n] === style) {\n valid = true;\n break;\n }\n }\n\n return valid;\n}\n\n/**\n *\n * @param {string | number} style\n * @param {object} dst\n */\nfunction setStyle(style, dst) {\n if (style === undefined) {\n return; // Nothing to do\n }\n\n let styleNumber;\n\n if (typeof style === \"string\") {\n styleNumber = getStyleNumberByName(style);\n\n if (styleNumber === -1) {\n throw new Error(\"Style '\" + style + \"' is invalid\");\n }\n } else {\n // Do a pedantic check on style number value\n if (!checkStyleNumber(style)) {\n throw new Error(\"Style '\" + style + \"' is invalid\");\n }\n\n styleNumber = style;\n }\n\n dst.style = styleNumber;\n}\n\n/**\n * Set the background styling for the graph\n * @param {string | {fill: string, stroke: string, strokeWidth: string}} backgroundColor\n * @param {object} dst\n */\nfunction setBackgroundColor(backgroundColor, dst) {\n let fill = \"white\";\n let stroke = \"gray\";\n let strokeWidth = 1;\n\n if (typeof backgroundColor === \"string\") {\n fill = backgroundColor;\n stroke = \"none\";\n strokeWidth = 0;\n } else if (typeof backgroundColor === \"object\") {\n if (backgroundColor.fill !== undefined) fill = backgroundColor.fill;\n if (backgroundColor.stroke !== undefined) stroke = backgroundColor.stroke;\n if (backgroundColor.strokeWidth !== undefined)\n strokeWidth = backgroundColor.strokeWidth;\n } else {\n throw new Error(\"Unsupported type of backgroundColor\");\n }\n\n dst.frame.style.backgroundColor = fill;\n dst.frame.style.borderColor = stroke;\n dst.frame.style.borderWidth = strokeWidth + \"px\";\n dst.frame.style.borderStyle = \"solid\";\n}\n\n/**\n *\n * @param {string | object} dataColor\n * @param {object} dst\n */\nfunction setDataColor(dataColor, dst) {\n if (dataColor === undefined) {\n return; // Nothing to do\n }\n\n if (dst.dataColor === undefined) {\n dst.dataColor = {};\n }\n\n if (typeof dataColor === \"string\") {\n dst.dataColor.fill = dataColor;\n dst.dataColor.stroke = dataColor;\n } else {\n if (dataColor.fill) {\n dst.dataColor.fill = dataColor.fill;\n }\n if (dataColor.stroke) {\n dst.dataColor.stroke = dataColor.stroke;\n }\n if (dataColor.strokeWidth !== undefined) {\n dst.dataColor.strokeWidth = dataColor.strokeWidth;\n }\n }\n}\n\n/**\n *\n * @param {object | Array<string>} surfaceColors Either an object that describes the HUE, or an array of HTML hex color codes\n * @param {object} dst\n */\nfunction setSurfaceColor(surfaceColors, dst) {\n if (surfaceColors === undefined || surfaceColors === true) {\n return; // Nothing to do\n }\n if (surfaceColors === false) {\n dst.surfaceColors = undefined;\n return;\n }\n\n if (dst.surfaceColors === undefined) {\n dst.surfaceColors = {};\n }\n\n let rgbColors;\n if (Array.isArray(surfaceColors)) {\n rgbColors = parseColorArray(surfaceColors);\n } else if (typeof surfaceColors === \"object\") {\n rgbColors = parseColorObject(surfaceColors.hue);\n } else {\n throw new Error(\"Unsupported type of surfaceColors\");\n }\n // for some reason surfaceColors goes from vMax to vMin:\n rgbColors.reverse();\n dst.colormap = rgbColors;\n}\n\n/**\n *\n * @param {object | Array<string>} colormap Either an object that describes the HUE, or an array of HTML hex color codes\n * @param {object} dst\n */\nfunction setColormap(colormap, dst) {\n if (colormap === undefined) {\n return;\n }\n\n let rgbColors;\n if (Array.isArray(colormap)) {\n rgbColors = parseColorArray(colormap);\n } else if (typeof colormap === \"object\") {\n rgbColors = parseColorObject(colormap.hue);\n } else if (typeof colormap === \"function\") {\n rgbColors = colormap;\n } else {\n throw new Error(\"Unsupported type of colormap\");\n }\n dst.colormap = rgbColors;\n}\n\n/**\n *\n * @param {Array} colormap\n */\nfunction parseColorArray(colormap) {\n if (colormap.length < 2) {\n throw new Error(\"Colormap array length must be 2 or above.\");\n }\n return colormap.map(function (colorCode) {\n if (!util.isValidHex(colorCode)) {\n throw new Error(`Invalid hex color code supplied to colormap.`);\n }\n return util.hexToRGB(colorCode);\n });\n}\n\n/**\n * Converts an object to a certain amount of hex color stops. At which point:\n * the HTML hex color codes is converted into an RGB color object.\n * @param {object} hues\n */\nfunction parseColorObject(hues) {\n if (hues === undefined) {\n throw new Error(\"Unsupported type of colormap\");\n }\n if (!(hues.saturation >= 0 && hues.saturation <= 100)) {\n throw new Error(\"Saturation is out of bounds. Expected range is 0-100.\");\n }\n if (!(hues.brightness >= 0 && hues.brightness <= 100)) {\n throw new Error(\"Brightness is out of bounds. Expected range is 0-100.\");\n }\n if (!(hues.colorStops >= 2)) {\n throw new Error(\"colorStops is out of bounds. Expected 2 or above.\");\n }\n\n const hueStep = (hues.end - hues.start) / (hues.colorStops - 1);\n\n const rgbColors = [];\n for (let i = 0; i < hues.colorStops; ++i) {\n const hue = ((hues.start + hueStep * i) % 360) / 360;\n rgbColors.push(\n util.HSVToRGB(\n hue < 0 ? hue + 1 : hue,\n hues.saturation / 100,\n hues.brightness / 100,\n ),\n );\n }\n return rgbColors;\n}\n\n/**\n *\n * @param {object} cameraPosition\n * @param {object} dst\n */\nfunction setCameraPosition(cameraPosition, dst) {\n const camPos = cameraPosition;\n if (camPos === undefined) {\n return;\n }\n\n if (dst.camera === undefined) {\n dst.camera = new Camera();\n }\n\n dst.camera.setArmRotation(camPos.horizontal, camPos.vertical);\n dst.camera.setArmLength(camPos.distance);\n}\n\nexport { STYLE, setCameraPosition, setDefaults, setOptions };\n","/**\n * This object contains all possible options. It will check if the types are correct, if required if the option is one\n * of the allowed values.\n *\n * __any__ means that the name of the property does not matter.\n * __type__ is a required field for all objects and contains the allowed types of all objects\n */\nconst string = \"string\";\nconst bool = \"boolean\";\nconst number = \"number\";\nconst object = \"object\"; // should only be in a __type__ property\nconst array = \"array\";\n// Following not used here, but useful for reference\n//let dom = 'dom';\n//let any = 'any';\n\nconst colorOptions = {\n fill: { string },\n stroke: { string },\n strokeWidth: { number },\n __type__: { string, object, undefined: \"undefined\" },\n};\n\nconst surfaceColorsOptions = {\n hue: {\n start: { number },\n end: { number },\n saturation: { number },\n brightness: { number },\n colorStops: { number },\n __type__: { object },\n },\n __type__: { boolean: bool, array, object, undefined: \"undefined\" },\n};\n\nconst colormapOptions = {\n hue: {\n start: { number },\n end: { number },\n saturation: { number },\n brightness: { number },\n colorStops: { number },\n __type__: { object },\n },\n __type__: { array, object, function: \"function\", undefined: \"undefined\" },\n};\n\n/**\n * Order attempted to be alphabetical.\n * - x/y/z-prefixes ignored in sorting\n * - __type__ always at end\n * - globals at end\n */\nconst allOptions = {\n animationAutoStart: { boolean: bool, undefined: \"undefined\" },\n animationInterval: { number },\n animationPreload: { boolean: bool },\n axisColor: { string },\n axisFontSize: { number: number },\n axisFontType: { string: string },\n backgroundColor: colorOptions,\n xBarWidth: { number, undefined: \"undefined\" },\n yBarWidth: { number, undefined: \"undefined\" },\n cameraPosition: {\n distance: { number },\n horizontal: { number },\n vertical: { number },\n __type__: { object },\n },\n zoomable: { boolean: bool },\n ctrlToZoom: { boolean: bool },\n xCenter: { string },\n yCenter: { string },\n colormap: colormapOptions,\n dataColor: colorOptions,\n dotSizeMinFraction: { number },\n dotSizeMaxFraction: { number },\n dotSizeRatio: { number },\n filterLabel: { string },\n gridColor: { string },\n onclick: { function: \"function\" },\n keepAspectRatio: { boolean: bool },\n xLabel: { string },\n yLabel: { string },\n zLabel: { string },\n legendLabel: { string },\n xMin: { number, undefined: \"undefined\" },\n yMin: { number, undefined: \"undefined\" },\n zMin: { number, undefined: \"undefined\" },\n xMax: { number, undefined: \"undefined\" },\n yMax: { number, undefined: \"undefined\" },\n zMax: { number, undefined: \"undefined\" },\n showAnimationControls: { boolean: bool, undefined: \"undefined\" },\n showGrayBottom: { boolean: bool },\n showGrid: { boolean: bool },\n showLegend: { boolean: bool, undefined: \"undefined\" },\n showPerspective: { boolean: bool },\n showShadow: { boolean: bool },\n showSurfaceGrid: { boolean: bool },\n showXAxis: { boolean: bool },\n showYAxis: { boolean: bool },\n showZAxis: { boolean: bool },\n rotateAxisLabels: { boolean: bool },\n surfaceColors: surfaceColorsOptions,\n xStep: { number, undefined: \"undefined\" },\n yStep: { number, undefined: \"undefined\" },\n zStep: { number, undefined: \"undefined\" },\n style: {\n number, // TODO: either Graph3d.DEFAULT has string, or number allowed in documentation\n string: [\n \"bar\",\n \"bar-color\",\n \"bar-size\",\n \"dot\",\n \"dot-line\",\n \"dot-color\",\n \"dot-size\",\n \"line\",\n \"grid\",\n \"surface\",\n ],\n },\n tooltip: { boolean: bool, function: \"function\" },\n tooltipDelay: { number: number },\n tooltipStyle: {\n content: {\n color: { string },\n background: { string },\n border: { string },\n borderRadius: { string },\n boxShadow: { string },\n padding: { string },\n __type__: { object },\n },\n line: {\n borderLeft: { string },\n height: { string },\n width: { string },\n pointerEvents: { string },\n __type__: { object },\n },\n dot: {\n border: { string },\n borderRadius: { string },\n height: { string },\n width: { string },\n pointerEvents: { string },\n __type__: { object },\n },\n __type__: { object },\n },\n xValueLabel: { function: \"function\" },\n yValueLabel: { function: \"function\" },\n zValueLabel: { function: \"function\" },\n valueMax: { number, undefined: \"undefined\" },\n valueMin: { number, undefined: \"undefined\" },\n verticalRatio: { number },\n\n //globals :\n height: { string },\n width: { string },\n __type__: { object },\n};\n\nexport { allOptions };\n","/**\n * Helper class to make working with related min and max values easier.\n *\n * The range is inclusive; a given value is considered part of the range if:\n *\n * this.min <= value <= this.max\n */\nfunction Range() {\n this.min = undefined;\n this.max = undefined;\n}\n\n/**\n * Adjust the range so that the passed value fits in it.\n *\n * If the value is outside of the current extremes, adjust\n * the min or max so that the value is within the range.\n * @param {number} value Numeric value to fit in range\n */\nRange.prototype.adjust = function (value) {\n if (value === undefined) return;\n\n if (this.min === undefined || this.min > value) {\n this.min = value;\n }\n\n if (this.max === undefined || this.max < value) {\n this.max = value;\n }\n};\n\n/**\n * Adjust the current range so that the passed range fits in it.\n * @param {Range} range Range instance to fit in current instance\n */\nRange.prototype.combine = function (range) {\n this.add(range.min);\n this.add(range.max);\n};\n\n/**\n * Expand the range by the given value\n *\n * min will be lowered by given value;\n * max will be raised by given value\n *\n * Shrinking by passing a negative value is allowed.\n * @param {number} val Amount by which to expand or shrink current range with\n */\nRange.prototype.expand = function (val) {\n if (val === undefined) {\n return;\n }\n\n const newMin = this.min - val;\n const newMax = this.max + val;\n\n // Note that following allows newMin === newMax.\n // This should be OK, since method expand() allows this also.\n if (newMin > newMax) {\n throw new Error(\"Passed expansion value makes range invalid\");\n }\n\n this.min = newMin;\n this.max = newMax;\n};\n\n/**\n * Determine the full range width of current instance.\n * @returns {num} The calculated width of this range\n */\nRange.prototype.range = function () {\n return this.max - this.min;\n};\n\n/**\n * Determine the central point of current instance.\n * @returns {number} the value in the middle of min and max\n */\nRange.prototype.center = function () {\n return (this.min + this.max) / 2;\n};\n\nexport default Range;\n","import { DataView } from \"vis-data/esnext\";\n\n/**\n * @class Filter\n * @param {DataGroup} dataGroup the data group\n * @param {number} column The index of the column to be filtered\n * @param {Graph3d} graph The graph\n */\nfunction Filter(dataGroup, column, graph) {\n this.dataGroup = dataGroup;\n this.column = column;\n this.graph = graph; // the parent graph\n\n this.index = undefined;\n this.value = undefined;\n\n // read all distinct values and select the first one\n this.values = dataGroup.getDistinctValues(this.column);\n\n if (this.values.length > 0) {\n this.selectValue(0);\n }\n\n // create an array with the filtered datapoints. this will be loaded afterwards\n this.dataPoints = [];\n\n this.loaded = false;\n this.onLoadCallback = undefined;\n\n if (graph.animationPreload) {\n this.loaded = false;\n this.loadInBackground();\n } else {\n this.loaded = true;\n }\n}\n\n/**\n * Return the label\n * @returns {string} label\n */\nFilter.prototype.isLoaded = function () {\n return this.loaded;\n};\n\n/**\n * Return the loaded progress\n * @returns {number} percentage between 0 and 100\n */\nFilter.prototype.getLoadedProgress = function () {\n const len = this.values.length;\n\n let i = 0;\n while (this.dataPoints[i]) {\n i++;\n }\n\n return Math.round((i / len) * 100);\n};\n\n/**\n * Return the label\n * @returns {string} label\n */\nFilter.prototype.getLabel = function () {\n return this.graph.filterLabel;\n};\n\n/**\n * Return the columnIndex of the filter\n * @returns {number} columnIndex\n */\nFilter.prototype.getColumn = function () {\n return this.column;\n};\n\n/**\n * Return the currently selected value. Returns undefined if there is no selection\n * @returns {*} value\n */\nFilter.prototype.getSelectedValue = function () {\n if (this.index === undefined) return undefined;\n\n return this.values[this.index];\n};\n\n/**\n * Retrieve all values of the filter\n * @returns {Array} values\n */\nFilter.prototype.getValues = function () {\n return this.values;\n};\n\n/**\n * Retrieve one value of the filter\n * @param {number} index\n * @returns {*} value\n */\nFilter.prototype.getValue = function (index) {\n if (index >= this.values.length) throw new Error(\"Index out of range\");\n\n return this.values[index];\n};\n\n/**\n * Retrieve the (filtered) dataPoints for the currently selected filter index\n * @param {number} [index] (optional)\n * @returns {Array} dataPoints\n */\nFilter.prototype._getDataPoints = function (index) {\n if (index === undefined) index = this.index;\n\n if (index === undefined) return [];\n\n let dataPoints;\n if (this.dataPoints[index]) {\n dataPoints = this.dataPoints[index];\n } else {\n const f = {};\n f.column = this.column;\n f.value = this.values[index];\n\n const dataView = new DataView(this.dataGroup.getDataSet(), {\n filter: function (item) {\n return item[f.column] == f.value;\n },\n }).get();\n dataPoints = this.dataGroup._getDataPoints(dataView);\n\n this.dataPoints[index] = dataPoints;\n }\n\n return dataPoints;\n};\n\n/**\n * Set a callback function when the filter is fully loaded.\n * @param {Function} callback\n */\nFilter.prototype.setOnLoadCallback = function (callback) {\n this.onLoadCallback = callback;\n};\n\n/**\n * Add a value to the list with available values for this filter\n * No double entries will be created.\n * @param {number} index\n */\nFilter.prototype.selectValue = function (index) {\n if (index >= this.values.length) throw new Error(\"Index out of range\");\n\n this.index = index;\n this.value = this.values[index];\n};\n\n/**\n * Load all filtered rows in the background one by one\n * Start this method without providing an index!\n * @param {number} [index]\n */\nFilter.prototype.loadInBackground = function (index) {\n if (index === undefined) index = 0;\n\n const frame = this.graph.frame;\n\n if (index < this.values.length) {\n // create a progress box\n if (frame.progress === undefined) {\n frame.progress = document.createElement(\"DIV\");\n frame.progress.style.position = \"absolute\";\n frame.progress.style.color = \"gray\";\n frame.appendChild(frame.progress);\n }\n const progress = this.getLoadedProgress();\n frame.progress.innerHTML = \"Loading animation... \" + progress + \"%\";\n // TODO: this is no nice solution...\n frame.progress.style.bottom = 60 + \"px\"; // TODO: use height of slider\n frame.progress.style.left = 10 + \"px\";\n\n const me = this;\n setTimeout(function () {\n me.loadInBackground(index + 1);\n }, 10);\n this.loaded = false;\n } else {\n this.loaded = true;\n\n // remove the progress box\n if (frame.progress !== undefined) {\n frame.removeChild(frame.progress);\n frame.progress = undefined;\n }\n\n if (this.onLoadCallback) this.onLoadCallback();\n }\n};\n\nexport default Filter;\n","import { DataSet } from \"vis-data/esnext\";\nimport { DataView } from \"vis-data/esnext\";\nimport Range from \"./Range.js\";\nimport Filter from \"./Filter.js\";\nimport { STYLE } from \"./Settings.js\";\nimport Point3d from \"./Point3d.js\";\n\n/**\n * Creates a container for all data of one specific 3D-graph.\n *\n * On construction, the container is totally empty; the data\n * needs to be initialized with method initializeData().\n * Failure to do so will result in the following exception begin thrown\n * on instantiation of Graph3D:\n *\n * Error: Array, DataSet, or DataView expected\n * @function Object() { [native code] } DataGroup\n */\nfunction DataGroup() {\n this.dataTable = null; // The original data table\n}\n\n/**\n * Initializes the instance from the passed data.\n *\n * Calculates minimum and maximum values and column index values.\n *\n * The graph3d instance is used internally to access the settings for\n * the given instance.\n * TODO: Pass settings only instead.\n * @param {vis.Graph3d} graph3d Reference to the calling Graph3D instance.\n * @param {Array | DataSet | DataView} rawData The data containing the items for\n * the Graph.\n * @param {number} style Style Number\n * @returns {Array.<object>}\n */\nDataGroup.prototype.initializeData = function (graph3d, rawData, style) {\n if (rawData === undefined) return;\n\n if (Array.isArray(rawData)) {\n rawData = new DataSet(rawData);\n }\n\n let data;\n if (rawData instanceof DataSet || rawData instanceof DataView) {\n data = rawData.get();\n } else {\n throw new Error(\"Array, DataSet, or DataView expected\");\n }\n\n if (data.length == 0) return;\n\n this.style = style;\n\n // unsubscribe from the dataTable\n if (this.dataSet) {\n this.dataSet.off(\"*\", this._onChange);\n }\n\n this.dataSet = rawData;\n this.dataTable = data;\n\n // subscribe to changes in the dataset\n const me = this;\n this._onChange = function () {\n graph3d.setData(me.dataSet);\n };\n this.dataSet.on(\"*\", this._onChange);\n\n // determine the location of x,y,z,value,filter columns\n this.colX = \"x\";\n this.colY = \"y\";\n this.colZ = \"z\";\n\n const withBars = graph3d.hasBars(style);\n\n // determine barWidth from data\n if (withBars) {\n if (graph3d.defaultXBarWidth !== undefined) {\n this.xBarWidth = graph3d.defaultXBarWidth;\n } else {\n this.xBarWidth = this.getSmallestDifference(data, this.colX) || 1;\n }\n\n if (graph3d.defaultYBarWidth !== undefined) {\n this.yBarWidth = graph3d.defaultYBarWidth;\n } else {\n this.yBarWidth = this.getSmallestDifference(data, this.colY) || 1;\n }\n }\n\n // calculate minima and maxima\n this._initializeRange(data, this.colX, graph3d, withBars);\n this._initializeRange(data, this.colY, graph3d, withBars);\n this._initializeRange(data, this.colZ, graph3d, false);\n\n if (Object.prototype.hasOwnProperty.call(data[0], \"style\")) {\n this.colValue = \"style\";\n const valueRange = this.getColumnRange(data, this.colValue);\n this._setRangeDefaults(\n valueRange,\n graph3d.defaultValueMin,\n graph3d.defaultValueMax,\n );\n this.valueRange = valueRange;\n } else {\n this.colValue = \"z\";\n this.valueRange = this.zRange;\n }\n\n // Initialize data filter if a filter column is provided\n const table = this.getDataTable();\n if (Object.prototype.hasOwnProperty.call(table[0], \"filter\")) {\n if (this.dataFilter === undefined) {\n this.dataFilter = new Filter(this, \"filter\", graph3d);\n this.dataFilter.setOnLoadCallback(function () {\n graph3d.redraw();\n });\n }\n }\n\n let dataPoints;\n if (this.dataFilter) {\n // apply filtering\n dataPoints = this.dataFilter._getDataPoints();\n } else {\n // no filtering. load all data\n dataPoints = this._getDataPoints(this.getDataTable());\n }\n return dataPoints;\n};\n\n/**\n * Collect the range settings for the given data column.\n *\n * This internal method is intended to make the range\n * initalization more generic.\n *\n * TODO: if/when combined settings per axis defined, get rid of this.\n * @private\n * @param {'x'|'y'|'z'} column The data column to process\n * @param {vis.Graph3d} graph3d Reference to the calling Graph3D instance;\n * required for access to settings\n * @returns {object}\n */\nDataGroup.prototype._collectRangeSettings = function (column, graph3d) {\n const index = [\"x\", \"y\", \"z\"].indexOf(column);\n\n if (index == -1) {\n throw new Error(\"Column '\" + column + \"' invalid\");\n }\n\n const upper = column.toUpperCase();\n\n return {\n barWidth: this[column + \"BarWidth\"],\n min: graph3d[\"default\" + upper + \"Min\"],\n max: graph3d[\"default\" + upper + \"Max\"],\n step: graph3d[\"default\" + upper + \"Step\"],\n range_label: column + \"Range\", // Name of instance field to write to\n step_label: column + \"Step\", // Name of instance field to write to\n };\n};\n\n/**\n * Initializes the settings per given column.\n *\n * TODO: if/when combined settings per axis defined, rewrite this.\n * @private\n * @param {DataSet | DataView} data The data containing the items for the Graph\n * @param {'x'|'y'|'z'} column The data column to process\n * @param {vis.Graph3d} graph3d Reference to the calling Graph3D instance;\n * required for access to settings\n * @param {boolean} withBars True if initializing for bar graph\n */\nDataGroup.prototype._initializeRange = function (\n data,\n column,\n graph3d,\n withBars,\n) {\n const NUMSTEPS = 5;\n const settings = this._collectRangeSettings(column, graph3d);\n\n const range = this.getColumnRange(data, column);\n if (withBars && column != \"z\") {\n // Safeguard for 'z'; it doesn't have a bar width\n range.expand(settings.barWidth / 2);\n }\n\n this._setRangeDefaults(range, settings.min, settings.max);\n this[settings.range_label] = range;\n this[settings.step_label] =\n settings.step !== undefined ? settings.step : range.range() / NUMSTEPS;\n};\n\n/**\n * Creates a list with all the different values in the data for the given column.\n *\n * If no data passed, use the internal data of this instance.\n * @param {'x'|'y'|'z'} column The data column to process\n * @param {DataSet|DataView|undefined} data The data containing the items for the Graph\n * @returns {Array} All distinct values in the given column data, sorted ascending.\n */\nDataGroup.prototype.getDistinctValues = function (column, data) {\n if (data === undefined) {\n data = this.dataTable;\n }\n\n const values = [];\n\n for (let i = 0; i < data.length; i++) {\n const value = data[i][column] || 0;\n if (values.indexOf(value) === -1) {\n values.push(value);\n }\n }\n\n return values.sort(function (a, b) {\n return a - b;\n });\n};\n\n/**\n * Determine the smallest difference between the values for given\n * column in the passed data set.\n * @param {DataSet|DataView|undefined} data The data containing the items for the Graph\n * @param {'x'|'y'|'z'} column The data column to process\n * @returns {number|null} Smallest difference value or\n * null, if it can't be determined.\n */\nDataGroup.prototype.getSmallestDifference = function (data, column) {\n const values = this.getDistinctValues(data, column);\n\n // Get all the distinct diffs\n // Array values is assumed to be sorted here\n let smallest_diff = null;\n\n for (let i = 1; i < values.length; i++) {\n const diff = values[i] - values[i - 1];\n\n if (smallest_diff == null || smallest_diff > diff) {\n smallest_diff = diff;\n }\n }\n\n return smallest_diff;\n};\n\n/**\n * Get the absolute min/max values for the passed data column.\n * @param {DataSet|DataView|undefined} data The data containing the items for the Graph\n * @param {'x'|'y'|'z'} column The data column to process\n * @returns {Range} A Range instance with min/max members properly set.\n */\nDataGroup.prototype.getColumnRange = function (data, column) {\n const range = new Range();\n\n // Adjust the range so that it covers all values in the passed data elements.\n for (let i = 0; i < data.length; i++) {\n const item = data[i][column];\n range.adjust(item);\n }\n\n return range;\n};\n\n/**\n * Determines the number of rows in the current data.\n * @returns {number}\n */\nDataGroup.prototype.getNumberOfRows = function () {\n return this.dataTable.length;\n};\n\n/**\n * Set default values for range\n *\n * The default values override the range values, if defined.\n *\n * Because it's possible that only defaultMin or defaultMax is set, it's better\n * to pass in a range already set with the min/max set from the data. Otherwise,\n * it's quite hard to process the min/max properly.\n * @param {vis.Range} range\n * @param {number} [defaultMin]\n * @param {number} [defaultMax]\n * @private\n */\nDataGroup.prototype._setRangeDefaults = function (\n range,\n defaultMin,\n defaultMax,\n) {\n if (defaultMin !== undefined) {\n range.min = defaultMin;\n }\n\n if (defaultMax !== undefined) {\n range.max = defaultMax;\n }\n\n // This is the original way that the default min/max values were adjusted.\n // TODO: Perhaps it's better if an error is thrown if the values do not agree.\n // But this will change the behaviour.\n if (range.max <= range.min) range.max = range.min + 1;\n};\n\nDataGroup.prototype.getDataTable = function () {\n return this.dataTable;\n};\n\nDataGroup.prototype.getDataSet = function () {\n return this.dataSet;\n};\n\n/**\n * Return all data values as a list of Point3d objects\n * @param {Array.<object>} data\n * @returns {Array.<object>}\n */\nDataGroup.prototype.getDataPoints = function (data) {\n const dataPoints = [];\n\n for (let i = 0; i < data.length; i++) {\n const point = new Point3d();\n point.x = data[i][this.colX] || 0;\n point.y = data[i][this.colY] || 0;\n point.z = data[i][this.colZ] || 0;\n point.data = data[i];\n point.value = data[i][this.colValue] || 0;\n\n const obj = {};\n obj.point = point;\n obj.bottom = new Point3d(point.x, point.y, this.zRange.min);\n obj.trans = undefined;\n obj.screen = undefined;\n\n dataPoints.push(obj);\n }\n\n return dataPoints;\n};\n\n/**\n * Copy all values from the data table to a matrix.\n *\n * The provided values are supposed to form a grid of (x,y) positions.\n * @param {Array.<object>} data\n * @returns {Array.<object>}\n * @private\n */\nDataGroup.prototype.initDataAsMatrix = function (data) {\n // TODO: store the created matrix dataPoints in the filters instead of\n // reloading each time.\n let x, y, i, obj;\n\n // create two lists with all present x and y values\n const dataX = this.getDistinctValues(this.colX, data);\n const dataY = this.getDistinctValues(this.colY, data);\n\n const dataPoints = this.getDataPoints(data);\n\n // create a grid, a 2d matrix, with all values.\n const dataMatrix = []; // temporary data matrix\n for (i = 0; i < dataPoints.length; i++) {\n obj = dataPoints[i];\n\n // TODO: implement Array().indexOf() for Internet Explorer\n const xIndex = dataX.indexOf(obj.point.x);\n const yIndex = dataY.indexOf(obj.point.y);\n\n if (dataMatrix[xIndex] === undefined) {\n dataMatrix[xIndex] = [];\n }\n\n dataMatrix[xIndex][yIndex] = obj;\n }\n\n // fill in the pointers to the neighbors.\n for (x = 0; x < dataMatrix.length; x++) {\n for (y = 0; y < dataMatrix[x].length; y++) {\n if (dataMatrix[x][y]) {\n dataMatrix[x][y].pointRight =\n x < dataMatrix.length - 1 ? dataMatrix[x + 1][y] : undefined;\n dataMatrix[x][y].pointTop =\n y < dataMatrix[x].length - 1 ? dataMatrix[x][y + 1] : undefined;\n dataMatrix[x][y].pointCross =\n x < dataMatrix.length - 1 && y < dataMatrix[x].length - 1\n ? dataMatrix[x + 1][y + 1]\n : undefined;\n }\n }\n }\n\n return dataPoints;\n};\n\n/**\n * Return common information, if present\n * @returns {string}\n */\nDataGroup.prototype.getInfo = function () {\n const dataFilter = this.dataFilter;\n if (!dataFilter) return undefined;\n\n return dataFilter.getLabel() + \": \" + dataFilter.getSelectedValue();\n};\n\n/**\n * Reload the data\n */\nDataGroup.prototype.reload = function () {\n if (this.dataTable) {\n this.setData(this.dataTable);\n }\n};\n\n/**\n * Filter the data based on the current filter\n * @param {Array} data\n * @returns {Array} dataPoints Array with point objects which can be drawn on\n * screen\n */\nDataGroup.prototype._getDataPoints = function (data) {\n let dataPoints = [];\n\n if (this.style === STYLE.GRID || this.style === STYLE.SURFACE) {\n dataPoints = this.initDataAsMatrix(data);\n } else {\n // 'dot', 'dot-line', etc.\n dataPoints = this.getDataPoints(data);\n\n if (this.style === STYLE.LINE) {\n // Add next member points for line drawing\n for (let i = 0; i < dataPoints.length; i++) {\n if (i > 0) {\n dataPoints[i - 1].pointNext = dataPoints[i];\n }\n }\n }\n }\n\n return dataPoints;\n};\n\nexport default DataGroup;\n","import Emitter from \"component-emitter\";\nimport * as util from \"vis-util/esnext\";\nimport Point3d from \"./Point3d.js\";\nimport Point2d from \"./Point2d.js\";\nimport Slider from \"./Slider.js\";\nimport StepNumber from \"./StepNumber.js\";\nimport {\n STYLE,\n setCameraPosition,\n setDefaults,\n setOptions,\n} from \"./Settings.js\";\nimport { VALIDATOR_PRINT_STYLE, Validator } from \"vis-util/esnext\";\nimport { allOptions } from \"./options.js\";\nimport DataGroup from \"./DataGroup.js\";\n\n/// enumerate the available styles\nGraph3d.STYLE = STYLE;\n\n/**\n * Following label is used in the settings to describe values which should be\n * determined by the code while running, from the current data and graph style.\n *\n * Using 'undefined' directly achieves the same thing, but this is more\n * descriptive by describing the intent.\n */\nconst autoByDefault = undefined;\n\n/**\n * Default values for option settings.\n *\n * These are the values used when a Graph3d instance is initialized without\n * custom settings.\n *\n * If a field is not in this list, a default value of 'autoByDefault' is assumed,\n * which is just an alias for 'undefined'.\n */\nGraph3d.DEFAULTS = {\n width: \"400px\",\n height: \"400px\",\n filterLabel: \"time\",\n legendLabel: \"value\",\n xLabel: \"x\",\n yLabel: \"y\",\n zLabel: \"z\",\n xValueLabel: function (v) {\n return v;\n },\n yValueLabel: function (v) {\n return v;\n },\n zValueLabel: function (v) {\n return v;\n },\n showXAxis: true,\n showYAxis: true,\n showZAxis: true,\n showGrayBottom: false,\n showGrid: true,\n showPerspective: true,\n showShadow: false,\n showSurfaceGrid: true,\n keepAspectRatio: true,\n rotateAxisLabels: true,\n verticalRatio: 0.5, // 0.1 to 1.0, where 1.0 results in a 'cube'\n\n dotSizeRatio: 0.02, // size of the dots as a fraction of the graph width\n dotSizeMinFraction: 0.5, // size of min-value dot as a fraction of dotSizeRatio\n dotSizeMaxFraction: 2.5, // size of max-value dot as a fraction of dotSizeRatio\n\n showAnimationControls: autoByDefault,\n animationInterval: 1000, // milliseconds\n animationPreload: false,\n animationAutoStart: autoByDefault,\n\n axisFontSize: 14,\n axisFontType: \"arial\",\n axisColor: \"#4D4D4D\",\n gridColor: \"#D3D3D3\",\n xCenter: \"55%\",\n yCenter: \"50%\",\n\n style: Graph3d.STYLE.DOT,\n tooltip: false,\n tooltipDelay: 300, // milliseconds\n\n tooltipStyle: {\n content: {\n padding: \"10px\",\n border: \"1px solid #4d4d4d\",\n color: \"#1a1a1a\",\n background: \"rgba(255,255,255,0.7)\",\n borderRadius: \"2px\",\n boxShadow: \"5px 5px 10px rgba(128,128,128,0.5)\",\n },\n line: {\n height: \"40px\",\n width: \"0\",\n borderLeft: \"1px solid #4d4d4d\",\n pointerEvents: \"none\",\n },\n dot: {\n height: \"0\",\n width: \"0\",\n border: \"5px solid #4d4d4d\",\n borderRadius: \"5px\",\n pointerEvents: \"none\",\n },\n },\n\n dataColor: {\n fill: \"#7DC1FF\",\n stroke: \"#3267D2\",\n strokeWidth: 1, // px\n },\n\n surfaceColors: autoByDefault,\n colormap: autoByDefault,\n\n cameraPosition: {\n horizontal: 1.0,\n vertical: 0.5,\n distance: 1.7,\n },\n\n zoomable: true,\n ctrlToZoom: false,\n\n /*\n The following fields are 'auto by default', see above.\n */\n showLegend: autoByDefault, // determined by graph style\n backgroundColor: autoByDefault,\n\n xBarWidth: autoByDefault,\n yBarWidth: autoByDefault,\n valueMin: autoByDefault,\n valueMax: autoByDefault,\n xMin: autoByDefault,\n xMax: autoByDefault,\n xStep: autoByDefault,\n yMin: autoByDefault,\n yMax: autoByDefault,\n yStep: autoByDefault,\n zMin: autoByDefault,\n zMax: autoByDefault,\n zStep: autoByDefault,\n};\n\n// -----------------------------------------------------------------------------\n// Class Graph3d\n// -----------------------------------------------------------------------------\n\n/**\n * Graph3d displays data in 3d.\n *\n * Graph3d is developed in javascript as a Google Visualization Chart.\n * @function Object() { [native code] } Graph3d\n * @param {Element} container The DOM element in which the Graph3d will\n * be created. Normally a div element.\n * @param {DataSet | DataView | Array} [data]\n * @param {object} [options]\n */\nfunction Graph3d(container, data, options) {\n if (!(this instanceof Graph3d)) {\n throw new SyntaxError(\"Constructor must be called with the new operator\");\n }\n\n // create variables and set default values\n this.containerElement = container;\n\n this.dataGroup = new DataGroup();\n this.dataPoints = null; // The table with point objects\n\n // create a frame and canvas\n this.create();\n\n setDefaults(Graph3d.DEFAULTS, this);\n\n // the column indexes\n this.colX = undefined;\n this.colY = undefined;\n this.colZ = undefined;\n this.colValue = undefined;\n\n // TODO: customize axis range\n\n // apply options (also when undefined)\n this.setOptions(options);\n\n // apply data\n this.setData(data);\n}\n\n// Extend Graph3d with an Emitter mixin\nEmitter(Graph3d.prototype);\n\n/**\n * Calculate the scaling values, dependent on the range in x, y, and z direction\n */\nGraph3d.prototype._setScale = function () {\n this.scale = new Point3d(\n 1 / this.xRange.range(),\n 1 / this.yRange.range(),\n 1 / this.zRange.range(),\n );\n\n // keep aspect ration between x and y scale if desired\n if (this.keepAspectRatio) {\n if (this.scale.x < this.scale.y) {\n //noinspection JSSuspiciousNameCombination\n this.scale.y = this.scale.x;\n } else {\n //noinspection JSSuspiciousNameCombination\n this.scale.x = this.scale.y;\n }\n }\n\n // scale the vertical axis\n this.scale.z *= this.verticalRatio;\n // TODO: can this be automated? verticalRatio?\n\n // determine scale for (optional) value\n if (this.valueRange !== undefined) {\n this.scale.value = 1 / this.valueRange.range();\n }\n\n // position the camera arm\n const xCenter = this.xRange.center() * this.scale.x;\n const yCenter = this.yRange.center() * this.scale.y;\n const zCenter = this.zRange.center() * this.scale.z;\n this.camera.setArmLocation(xCenter, yCenter, zCenter);\n};\n\n/**\n * Convert a 3D location to a 2D location on screen\n * Source: ttp://en.wikipedia.org/wiki/3D_projection\n * @param {Point3d} point3d A 3D point with parameters x, y, z\n * @returns {Point2d} point2d A 2D point with parameters x, y\n */\nGraph3d.prototype._convert3Dto2D = function (point3d) {\n const translation = this._convertPointToTranslation(point3d);\n return this._convertTranslationToScreen(translation);\n};\n\n/**\n * Convert a 3D location its translation seen from the camera\n * Source: http://en.wikipedia.org/wiki/3D_projection\n * @param {Point3d} point3d A 3D point with parameters x, y, z\n * @returns {Point3d} translation A 3D point with parameters x, y, z This is\n * the translation of the point, seen from the\n * camera.\n */\nGraph3d.prototype._convertPointToTranslation = function (point3d) {\n const cameraLocation = this.camera.getCameraLocation(),\n cameraRotation = this.camera.getCameraRotation(),\n ax = point3d.x * this.scale.x,\n ay = point3d.y * this.scale.y,\n az = point3d.z * this.scale.z,\n cx = cameraLocation.x,\n cy = cameraLocation.y,\n cz = cameraLocation.z,\n // calculate angles\n sinTx = Math.sin(cameraRotation.x),\n cosTx = Math.cos(cameraRotation.x),\n sinTy = Math.sin(cameraRotation.y),\n cosTy = Math.cos(cameraRotation.y),\n sinTz = Math.sin(cameraRotation.z),\n cosTz = Math.cos(cameraRotation.z),\n // calculate translation\n dx = cosTy * (sinTz * (ay - cy) + cosTz * (ax - cx)) - sinTy * (az - cz),\n dy =\n sinTx *\n (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) +\n cosTx * (cosTz * (ay - cy) - sinTz * (ax - cx)),\n dz =\n cosTx *\n (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) -\n sinTx * (cosTz * (ay - cy) - sinTz * (ax - cx));\n\n return new Point3d(dx, dy, dz);\n};\n\n/**\n * Convert a translation point to a point on the screen\n * @param {Point3d} translation A 3D point with parameters x, y, z This is\n * the translation of the point, seen from the\n * camera.\n * @returns {Point2d} point2d A 2D point with parameters x, y\n */\nGraph3d.prototype._convertTranslationToScreen = function (translation) {\n const ex = this.eye.x,\n ey = this.eye.y,\n ez = this.eye.z,\n dx = translation.x,\n dy = translation.y,\n dz = translation.z;\n\n // calculate position on screen from translation\n let bx;\n let by;\n if (this.showPerspective) {\n bx = (dx - ex) * (ez / dz);\n by = (dy - ey) * (ez / dz);\n } else {\n bx = dx * -(ez / this.camera.getArmLength());\n by = dy * -(ez / this.camera.getArmLength());\n }\n\n // shift and scale the point to the center of the screen\n // use the width of the graph to scale both horizontally and vertically.\n return new Point2d(\n this.currentXCenter + bx * this.frame.canvas.clientWidth,\n this.currentYCenter - by * this.frame.canvas.clientWidth,\n );\n};\n\n/**\n * Calculate the translations and screen positions of all points\n * @param {Array.<Point3d>} points\n * @private\n */\nGraph3d.prototype._calcTranslations = function (points) {\n for (let i = 0; i < points.length; i++) {\n const point = points[i];\n point.trans = this._convertPointToTranslation(point.point);\n point.screen = this._convertTranslationToScreen(point.trans);\n\n // calculate the translation of the point at the bottom (needed for sorting)\n const transBottom = this._convertPointToTranslation(point.bottom);\n point.dist = this.showPerspective ? transBottom.length() : -transBottom.z;\n }\n\n // sort the points on depth of their (x,y) position (not on z)\n const sortDepth = function (a, b) {\n return b.dist - a.dist;\n };\n points.sort(sortDepth);\n};\n\n/**\n * Transfer min/max values to the Graph3d instance.\n */\nGraph3d.prototype._initializeRanges = function () {\n // TODO: later on, all min/maxes of all datagroups will be combined here\n const dg = this.dataGroup;\n this.xRange = dg.xRange;\n this.yRange = dg.yRange;\n this.zRange = dg.zRange;\n this.valueRange = dg.valueRange;\n\n // Values currently needed but which need to be sorted out for\n // the multiple graph case.\n this.xStep = dg.xStep;\n this.yStep = dg.yStep;\n this.zStep = dg.zStep;\n this.xBarWidth = dg.xBarWidth;\n this.yBarWidth = dg.yBarWidth;\n this.colX = dg.colX;\n this.colY = dg.colY;\n this.colZ = dg.colZ;\n this.colValue = dg.colValue;\n\n // set the scale dependent on the ranges.\n this._setScale();\n};\n\n/**\n * Return all data values as a list of Point3d objects\n * @param {vis.DataSet} data\n * @returns {Array.<object>}\n */\nGraph3d.prototype.getDataPoints = function (data) {\n const dataPoints = [];\n\n for (let i = 0; i < data.length; i++) {\n const point = new Point3d();\n point.x = data[i][this.colX] || 0;\n point.y = data[i][this.colY] || 0;\n point.z = data[i][this.colZ] || 0;\n point.data = data[i];\n point.value = data[i][this.colValue] || 0;\n\n const obj = {};\n obj.point = point;\n obj.bottom = new Point3d(point.x, point.y, this.zRange.min);\n obj.trans = undefined;\n obj.screen = undefined;\n\n dataPoints.push(obj);\n }\n\n return dataPoints;\n};\n\n/**\n * Filter the data based on the current filter\n * @param {Array} data\n * @returns {Array} dataPoints Array with point objects which can be drawn on\n * screen\n */\nGraph3d.prototype._getDataPoints = function (data) {\n // TODO: store the created matrix dataPoints in the filters instead of\n // reloading each time.\n let x, y, i, obj;\n\n let dataPoints = [];\n\n if (\n this.style === Graph3d.STYLE.GRID ||\n this.style === Graph3d.STYLE.SURFACE\n ) {\n // copy all values from the data table to a matrix\n // the provided values are supposed to form a grid of (x,y) positions\n\n // create two lists with all present x and y values\n const dataX = this.dataGroup.getDistinctValues(this.colX, data);\n const dataY = this.dataGroup.getDistinctValues(this.colY, data);\n\n dataPoints = this.getDataPoints(data);\n\n // create a grid, a 2d matrix, with all values.\n const dataMatrix = []; // temporary data matrix\n for (i = 0; i < dataPoints.length; i++) {\n obj = dataPoints[i];\n\n // TODO: implement Array().indexOf() for Internet Explorer\n const xIndex = dataX.indexOf(obj.point.x);\n const yIndex = dataY.indexOf(obj.point.y);\n\n if (dataMatrix[xIndex] === undefined) {\n dataMatrix[xIndex] = [];\n }\n\n dataMatrix[xIndex][yIndex] = obj;\n }\n\n // fill in the pointers to the neighbors.\n for (x = 0; x < dataMatrix.length; x++) {\n for (y = 0; y < dataMatrix[x].length; y++) {\n if (dataMatrix[x][y]) {\n dataMatrix[x][y].pointRight =\n x < dataMatrix.length - 1 ? dataMatrix[x + 1][y] : undefined;\n dataMatrix[x][y].pointTop =\n y < dataMatrix[x].length - 1 ? dataMatrix[x][y + 1] : undefined;\n dataMatrix[x][y].pointCross =\n x < dataMatrix.length - 1 && y < dataMatrix[x].length - 1\n ? dataMatrix[x + 1][y + 1]\n : undefined;\n }\n }\n }\n } else {\n // 'dot', 'dot-line', etc.\n dataPoints = this.getDataPoints(data);\n\n if (this.style === Graph3d.STYLE.LINE) {\n // Add next member points for line drawing\n for (i = 0; i < dataPoints.length; i++) {\n if (i > 0) {\n dataPoints[i - 1].pointNext = dataPoints[i];\n }\n }\n }\n }\n\n return dataPoints;\n};\n\n/**\n * Create the main frame for the Graph3d.\n *\n * This function is executed once when a Graph3d object is created. The frame\n * contains a canvas, and this canvas contains all objects like the axis and\n * nodes.\n */\nGraph3d.prototype.create = function () {\n // remove all elements from the container element.\n while (this.containerElement.hasChildNodes()) {\n this.containerElement.removeChild(this.containerElement.firstChild);\n }\n\n this.frame = document.createElement(\"div\");\n this.frame.style.position = \"relative\";\n this.frame.style.overflow = \"hidden\";\n\n // create the graph canvas (HTML canvas element)\n this.frame.canvas = document.createElement(\"canvas\");\n this.frame.canvas.style.position = \"relative\";\n this.frame.appendChild(this.frame.canvas);\n //if (!this.frame.canvas.getContext) {\n {\n const noCanvas = document.createElement(\"DIV\");\n noCanvas.style.color = \"red\";\n noCanvas.style.fontWeight = \"bold\";\n noCanvas.style.padding = \"10px\";\n noCanvas.innerHTML = \"Error: your browser does not support HTML canvas\";\n this.frame.canvas.appendChild(noCanvas);\n }\n\n this.frame.filter = document.createElement(\"div\");\n this.frame.filter.style.position = \"absolute\";\n this.frame.filter.style.bottom = \"0px\";\n this.frame.filter.style.left = \"0px\";\n this.frame.filter.style.width = \"100%\";\n this.frame.appendChild(this.frame.filter);\n\n // add event listeners to handle moving and zooming the contents\n const me = this;\n const onmousedown = function (event) {\n me._onMouseDown(event);\n };\n const ontouchstart = function (event) {\n me._onTouchStart(event);\n };\n const onmousewheel = function (event) {\n me._onWheel(event);\n };\n const ontooltip = function (event) {\n me._onTooltip(event);\n };\n const onclick = function (event) {\n me._onClick(event);\n };\n // TODO: these events are never cleaned up... can give a 'memory leakage'\n\n this.frame.canvas.addEventListener(\"mousedown\", onmousedown);\n this.frame.canvas.addEventListener(\"touchstart\", ontouchstart);\n this.frame.canvas.addEventListener(\"mousewheel\", onmousewheel);\n this.frame.canvas.addEventListener(\"mousemove\", ontooltip);\n this.frame.canvas.addEventListener(\"click\", onclick);\n\n // add the new graph to the container element\n this.containerElement.appendChild(this.frame);\n};\n\n/**\n * Set a new size for the graph\n * @param {number} width\n * @param {number} height\n * @private\n */\nGraph3d.prototype._setSize = function (width, height) {\n this.frame.style.width = width;\n this.frame.style.height = height;\n\n this._resizeCanvas();\n};\n\n/**\n * Resize the canvas to the current size of the frame\n */\nGraph3d.prototype._resizeCanvas = function () {\n this.frame.canvas.style.width = \"100%\";\n this.frame.canvas.style.height = \"100%\";\n\n this.frame.canvas.width = this.frame.canvas.clientWidth;\n this.frame.canvas.height = this.frame.canvas.clientHeight;\n\n // adjust with for margin\n this.frame.filter.style.width = this.frame.canvas.clientWidth - 2 * 10 + \"px\";\n};\n\n/**\n * Start playing the animation, if requested and filter present. Only applicable\n * when animation data is available.\n */\nGraph3d.prototype.animationStart = function () {\n // start animation when option is true\n if (!this.animationAutoStart || !this.dataGroup.dataFilter) return;\n\n if (!this.frame.filter || !this.frame.filter.slider)\n throw new Error(\"No animation available\");\n\n this.frame.filter.slider.play();\n};\n\n/**\n * Stop animation\n */\nGraph3d.prototype.animationStop = function () {\n if (!this.frame.filter || !this.frame.filter.slider) return;\n\n this.frame.filter.slider.stop();\n};\n\n/**\n * Resize the center position based on the current values in this.xCenter\n * and this.yCenter (which are strings with a percentage or a value\n * in pixels). The center positions are the variables this.currentXCenter\n * and this.currentYCenter\n */\nGraph3d.prototype._resizeCenter = function () {\n // calculate the horizontal center position\n if (this.xCenter.charAt(this.xCenter.length - 1) === \"%\") {\n this.currentXCenter =\n (parseFloat(this.xCenter) / 100) * this.frame.canvas.clientWidth;\n } else {\n this.currentXCenter = parseFloat(this.xCenter); // supposed to be in px\n }\n\n // calculate the vertical center position\n if (this.yCenter.charAt(this.yCenter.length - 1) === \"%\") {\n this.currentYCenter =\n (parseFloat(this.yCenter) / 100) *\n (this.frame.canvas.clientHeight - this.frame.filter.clientHeight);\n } else {\n this.currentYCenter = parseFloat(this.yCenter); // supposed to be in px\n }\n};\n\n/**\n * Retrieve the current camera rotation\n * @returns {object} An object with parameters horizontal, vertical, and\n * distance\n */\nGraph3d.prototype.getCameraPosition = function () {\n const pos = this.camera.getArmRotation();\n pos.distance = this.camera.getArmLength();\n return pos;\n};\n\n/**\n * Load data into the 3D Graph\n * @param {vis.DataSet} data\n * @private\n */\nGraph3d.prototype._readData = function (data) {\n // read the data\n this.dataPoints = this.dataGroup.initializeData(this, data, this.style);\n\n this._initializeRanges();\n this._redrawFilter();\n};\n\n/**\n * Replace the dataset of the Graph3d\n * @param {Array | DataSet | DataView} data\n */\nGraph3d.prototype.setData = function (data) {\n if (data === undefined || data === null) return;\n\n this._readData(data);\n this.redraw();\n this.animationStart();\n};\n\n/**\n * Update the options. Options will be merged with current options\n * @param {object} options\n */\nGraph3d.prototype.setOptions = function (options) {\n if (options === undefined) return;\n\n const errorFound = Validator.validate(options, allOptions);\n if (errorFound === true) {\n console.error(\n \"%cErrors have been found in the supplied options object.\",\n VALIDATOR_PRINT_STYLE,\n );\n }\n\n this.animationStop();\n\n setOptions(options, this);\n this.setPointDrawingMethod();\n this._setSize(this.width, this.height);\n this.setAxisLabelMethod();\n\n this.setData(this.dataGroup.getDataTable());\n this.animationStart();\n};\n\n/**\n * Determine which point drawing method to use for the current graph style.\n */\nGraph3d.prototype.setPointDrawingMethod = function () {\n let method = undefined;\n\n switch (this.style) {\n case Graph3d.STYLE.BAR:\n method = this._redrawBarGraphPoint;\n break;\n case Graph3d.STYLE.BARCOLOR:\n method = this._redrawBarColorGraphPoint;\n break;\n case Graph3d.STYLE.BARSIZE:\n method = this._redrawBarSizeGraphPoint;\n break;\n case Graph3d.STYLE.DOT:\n method = this._redrawDotGraphPoint;\n break;\n case Graph3d.STYLE.DOTLINE:\n method = this._redrawDotLineGraphPoint;\n break;\n case Graph3d.STYLE.DOTCOLOR:\n method = this._redrawDotColorGraphPoint;\n break;\n case Graph3d.STYLE.DOTSIZE:\n method = this._redrawDotSizeGraphPoint;\n break;\n case Graph3d.STYLE.SURFACE:\n method = this._redrawSurfaceGraphPoint;\n break;\n case Graph3d.STYLE.GRID:\n method = this._redrawGridGraphPoint;\n break;\n case Graph3d.STYLE.LINE:\n method = this._redrawLineGraphPoint;\n break;\n default:\n throw new Error(\n \"Can not determine point drawing method \" +\n \"for graph style '\" +\n this.style +\n \"'\",\n );\n }\n\n this._pointDrawingMethod = method;\n};\n\n/**\n * Determine which functions to use to draw axis labels.\n */\nGraph3d.prototype.setAxisLabelMethod = function () {\n if (this.rotateAxisLabels) {\n this._drawAxisLabelX = this.drawAxisLabelXRotate;\n this._drawAxisLabelY = this.drawAxisLabelYRotate;\n this._drawAxisLabelZ = this.drawAxisLabelZRotate;\n } else {\n this._drawAxisLabelX = this.drawAxisLabelX;\n this._drawAxisLabelY = this.drawAxisLabelY;\n this._drawAxisLabelZ = this.drawAxisLabelZ;\n }\n};\n\n/**\n * Redraw the Graph.\n */\nGraph3d.prototype.redraw = function () {\n if (this.dataPoints === undefined) {\n throw new Error(\"Graph data not initialized\");\n }\n\n this._resizeCanvas();\n this._resizeCenter();\n this._redrawSlider();\n this._redrawClear();\n this._redrawAxis();\n\n this._redrawDataGraph();\n\n this._redrawInfo();\n this._redrawLegend();\n};\n\n/**\n * Get drawing context without exposing canvas\n * @returns {CanvasRenderingContext2D}\n * @private\n */\nGraph3d.prototype._getContext = function () {\n const canvas = this.frame.canvas;\n const ctx = canvas.getContext(\"2d\");\n\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n\n return ctx;\n};\n\n/**\n * Clear the canvas before redrawing\n */\nGraph3d.prototype._redrawClear = function () {\n const canvas = this.frame.canvas;\n const ctx = canvas.getContext(\"2d\");\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n};\n\nGraph3d.prototype._dotSize = function () {\n return this.frame.clientWidth * this.dotSizeRatio;\n};\n\n/**\n * Get legend width\n * @returns {*}\n * @private\n */\nGraph3d.prototype._getLegendWidth = function () {\n let width;\n\n if (this.style === Graph3d.STYLE.DOTSIZE) {\n const dotSize = this._dotSize();\n //width = dotSize / 2 + dotSize * 2;\n width = dotSize * this.dotSizeMaxFraction;\n } else if (this.style === Graph3d.STYLE.BARSIZE) {\n width = this.xBarWidth;\n } else {\n width = 20;\n }\n return width;\n};\n\n/**\n * Redraw the legend based on size, dot color, or surface height\n */\nGraph3d.prototype._redrawLegend = function () {\n //Return without drawing anything, if no legend is specified\n if (this.showLegend !== true) {\n return;\n }\n\n // Do not draw legend when graph style does not support\n if (\n this.style === Graph3d.STYLE.LINE ||\n this.style === Graph3d.STYLE.BARSIZE //TODO add legend support for BARSIZE\n ) {\n return;\n }\n\n // Legend types - size and color. Determine if size legend.\n const isSizeLegend =\n this.style === Graph3d.STYLE.BARSIZE ||\n this.style === Graph3d.STYLE.DOTSIZE;\n\n // Legend is either tracking z values or style values. This flag if false means use z values.\n const isValueLegend =\n this.style === Graph3d.STYLE.DOTSIZE ||\n this.style === Graph3d.STYLE.DOTCOLOR ||\n this.style === Graph3d.STYLE.SURFACE ||\n this.style === Graph3d.STYLE.BARCOLOR;\n\n const height = Math.max(this.frame.clientHeight * 0.25, 100);\n const top = this.margin;\n const width = this._getLegendWidth(); // px - overwritten by size legend\n const right = this.frame.clientWidth - this.margin;\n const left = right - width;\n const bottom = top + height;\n\n const ctx = this._getContext();\n ctx.lineWidth = 1;\n ctx.font = \"14px arial\"; // TODO: put in options\n\n if (isSizeLegend === false) {\n // draw the color bar\n const ymin = 0;\n const ymax = height; // Todo: make height customizable\n let y;\n\n for (y = ymin; y < ymax; y++) {\n // Need (1 - x) because y runs from top to bottom:\n const f = 1 - (y - ymin) / (ymax - ymin);\n const color = this._colormap(f, 1);\n\n ctx.strokeStyle = color;\n ctx.beginPath();\n ctx.moveTo(left, top + y);\n ctx.lineTo(right, top + y);\n ctx.stroke();\n }\n ctx.strokeStyle = this.axisColor;\n ctx.strokeRect(left, top, width, height);\n } else {\n // draw the size legend box\n let widthMin;\n if (this.style === Graph3d.STYLE.DOTSIZE) {\n // Get the proportion to max and min right\n widthMin = width * (this.dotSizeMinFraction / this.dotSizeMaxFraction);\n } else if (this.style === Graph3d.STYLE.BARSIZE) {\n //widthMin = this.xBarWidth * 0.2 this is wrong - barwidth measures in terms of xvalues\n }\n ctx.strokeStyle = this.axisColor;\n ctx.fillStyle = this.dataColor.fill;\n ctx.beginPath();\n ctx.moveTo(left, top);\n ctx.lineTo(right, top);\n ctx.lineTo(left + widthMin, bottom);\n ctx.lineTo(left, bottom);\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n }\n\n // print value text along the legend edge\n const gridLineLen = 5; // px\n\n const legendMin = isValueLegend ? this.valueRange.min : this.zRange.min;\n const legendMax = isValueLegend ? this.valueRange.max : this.zRange.max;\n const step = new StepNumber(\n legendMin,\n legendMax,\n (legendMax - legendMin) / 5,\n true,\n );\n step.start(true);\n\n while (!step.end()) {\n const y =\n bottom -\n ((step.getCurrent() - legendMin) / (legendMax - legendMin)) * height;\n const from = new Point2d(left - gridLineLen, y);\n const to = new Point2d(left, y);\n this._line(ctx, from, to);\n\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = this.axisColor;\n ctx.fillText(step.getCurrent(), left - 2 * gridLineLen, y);\n\n step.next();\n }\n\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"top\";\n const label = this.legendLabel;\n ctx.fillText(label, right, bottom + this.margin);\n};\n\n/**\n * Redraw the filter\n */\nGraph3d.prototype._redrawFilter = function () {\n const dataFilter = this.dataGroup.dataFilter;\n const filter = this.frame.filter;\n filter.innerHTML = \"\";\n\n if (!dataFilter) {\n filter.slider = undefined;\n return;\n }\n\n const options = {\n visible: this.showAnimationControls,\n };\n const slider = new Slider(filter, options);\n filter.slider = slider;\n\n // TODO: css here is not nice here...\n filter.style.padding = \"10px\";\n //this.frame.filter.style.backgroundColor = '#EFEFEF';\n\n slider.setValues(dataFilter.values);\n slider.setPlayInterval(this.animationInterval);\n\n // create an event handler\n const me = this;\n const onchange = function () {\n const dataFilter = me.dataGroup.dataFilter;\n const index = slider.getIndex();\n\n dataFilter.selectValue(index);\n me.dataPoints = dataFilter._getDataPoints();\n\n me.redraw();\n };\n\n slider.setOnChangeCallback(onchange);\n};\n\n/**\n * Redraw the slider\n */\nGraph3d.prototype._redrawSlider = function () {\n if (this.frame.filter.slider !== undefined) {\n this.frame.filter.slider.redraw();\n }\n};\n\n/**\n * Redraw common information\n */\nGraph3d.prototype._redrawInfo = function () {\n const info = this.dataGroup.getInfo();\n if (info === undefined) return;\n\n const ctx = this._getContext();\n\n ctx.font = \"14px arial\"; // TODO: put in options\n ctx.lineStyle = \"gray\";\n ctx.fillStyle = \"gray\";\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n\n const x = this.margin;\n const y = this.margin;\n ctx.fillText(info, x, y);\n};\n\n/**\n * Draw a line between 2d points 'from' and 'to'.\n *\n * If stroke style specified, set that as well.\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point2d} from\n * @param {vis.Point2d} to\n * @param {string} [strokeStyle]\n * @private\n */\nGraph3d.prototype._line = function (ctx, from, to, strokeStyle) {\n if (strokeStyle !== undefined) {\n ctx.strokeStyle = strokeStyle;\n }\n\n ctx.beginPath();\n ctx.moveTo(from.x, from.y);\n ctx.lineTo(to.x, to.y);\n ctx.stroke();\n};\n\n/**\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point3d} point3d\n * @param {string} text\n * @param {number} armAngle\n * @param {number} [yMargin]\n */\nGraph3d.prototype.drawAxisLabelX = function (\n ctx,\n point3d,\n text,\n armAngle,\n yMargin,\n) {\n if (yMargin === undefined) {\n yMargin = 0;\n }\n\n const point2d = this._convert3Dto2D(point3d);\n\n if (Math.cos(armAngle * 2) > 0) {\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n point2d.y += yMargin;\n } else if (Math.sin(armAngle * 2) < 0) {\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n } else {\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n }\n\n ctx.fillStyle = this.axisColor;\n ctx.fillText(text, point2d.x, point2d.y);\n};\n\n/**\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point3d} point3d\n * @param {string} text\n * @param {number} armAngle\n * @param {number} [yMargin]\n */\nGraph3d.prototype.drawAxisLabelY = function (\n ctx,\n point3d,\n text,\n armAngle,\n yMargin,\n) {\n if (yMargin === undefined) {\n yMargin = 0;\n }\n\n const point2d = this._convert3Dto2D(point3d);\n\n if (Math.cos(armAngle * 2) < 0) {\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n point2d.y += yMargin;\n } else if (Math.sin(armAngle * 2) > 0) {\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n } else {\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n }\n\n ctx.fillStyle = this.axisColor;\n ctx.fillText(text, point2d.x, point2d.y);\n};\n\n/**\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point3d} point3d\n * @param {string} text\n * @param {number} [offset]\n */\nGraph3d.prototype.drawAxisLabelZ = function (ctx, point3d, text, offset) {\n if (offset === undefined) {\n offset = 0;\n }\n\n const point2d = this._convert3Dto2D(point3d);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = this.axisColor;\n ctx.fillText(text, point2d.x - offset, point2d.y);\n};\n\n/**\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point3d} point3d\n * @param {string} text\n * @param {number} armAngle\n * @param {number} [yMargin]\n */\nGraph3d.prototype.drawAxisLabelXRotate = function (\n ctx,\n point3d,\n text,\n armAngle,\n yMargin,\n) {\n if (yMargin === undefined) {\n yMargin = 0;\n }\n\n const point2d = this._convert3Dto2D(point3d);\n if (Math.cos(armAngle * 2) > 0) {\n ctx.save();\n ctx.translate(point2d.x, point2d.y);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = this.axisColor;\n ctx.fillText(text, 0, 0);\n ctx.restore();\n } else if (Math.sin(armAngle * 2) < 0) {\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = this.axisColor;\n ctx.fillText(text, point2d.x, point2d.y);\n } else {\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = this.axisColor;\n ctx.fillText(text, point2d.x, point2d.y);\n }\n};\n\n/**\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point3d} point3d\n * @param {string} text\n * @param {number} armAngle\n * @param {number} [yMargin]\n */\nGraph3d.prototype.drawAxisLabelYRotate = function (\n ctx,\n point3d,\n text,\n armAngle,\n yMargin,\n) {\n if (yMargin === undefined) {\n yMargin = 0;\n }\n\n const point2d = this._convert3Dto2D(point3d);\n if (Math.cos(armAngle * 2) < 0) {\n ctx.save();\n ctx.translate(point2d.x, point2d.y);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = this.axisColor;\n ctx.fillText(text, 0, 0);\n ctx.restore();\n } else if (Math.sin(armAngle * 2) > 0) {\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = this.axisColor;\n ctx.fillText(text, point2d.x, point2d.y);\n } else {\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = this.axisColor;\n ctx.fillText(text, point2d.x, point2d.y);\n }\n};\n\n/**\n *\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point3d} point3d\n * @param {string} text\n * @param {number} [offset]\n */\nGraph3d.prototype.drawAxisLabelZRotate = function (ctx, point3d, text, offset) {\n if (offset === undefined) {\n offset = 0;\n }\n\n const point2d = this._convert3Dto2D(point3d);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = this.axisColor;\n ctx.fillText(text, point2d.x - offset, point2d.y);\n};\n\n/**\n \n \n /**\n Draw a line between 2d points 'from' and 'to'.\n \n If stroke style specified, set that as well.\n * @param {CanvasRenderingContext2D} ctx\n * @param {vis.Point2d} from\n * @param {vis.Point2d} to\n * @param {string} [strokeStyle]\n * @private\n */\nGraph3d.prototype._line3d = function (ctx, from, to, strokeStyle) {\n const from2d = this._convert3Dto2D(from);\n const to2d = this._convert3Dto2D(to);\n\n this._line(ctx, from2d, to2d, strokeStyle);\n};\n\n/**\n * Redraw the axis\n */\nGraph3d.prototype._redrawAxis = function () {\n const ctx = this._getContext();\n let from,\n to,\n step,\n prettyStep,\n text,\n xText,\n yText,\n zText,\n offset,\n xOffset,\n yOffset;\n\n // TODO: get the actual rendered style of the containerElement\n //ctx.font = this.containerElement.style.font;\n //ctx.font = 24 / this.camera.getArmLength() + 'px arial';\n ctx.font =\n this.axisFontSize / this.camera.getArmLength() + \"px \" + this.axisFontType;\n\n // calculate the length for the short grid lines\n const gridLenX = 0.025 / this.scale.x;\n const gridLenY = 0.025 / this.scale.y;\n const textMargin = 5 / this.camera.getArmLength(); // px\n const armAngle = this.camera.getArmRotation().horizontal;\n const armVector = new Point2d(Math.cos(armAngle), Math.sin(armAngle));\n\n const xRange = this.xRange;\n const yRange = this.yRange;\n const zRange = this.zRange;\n let point3d;\n\n // draw x-grid lines\n ctx.lineWidth = 1;\n prettyStep = this.defaultXStep === undefined;\n step = new StepNumber(xRange.min, xRange.max, this.xStep, prettyStep);\n step.start(true);\n\n while (!step.end()) {\n const x = step.getCurrent();\n\n if (this.showGrid) {\n from = new Point3d(x, yRange.min, zRange.min);\n to = new Point3d(x, yRange.max, zRange.min);\n this._line3d(ctx, from, to, this.gridColor);\n } else if (this.showXAxis) {\n from = new Point3d(x, yRange.min, zRange.min);\n to = new Point3d(x, yRange.min + gridLenX, zRange.min);\n this._line3d(ctx, from, to, this.axisColor);\n\n from = new Point3d(x, yRange.max, zRange.min);\n to = new Point3d(x, yRange.max - gridLenX, zRange.min);\n this._line3d(ctx, from, to, this.axisColor);\n }\n\n if (this.showXAxis) {\n yText = armVector.x > 0 ? yRange.min : yRange.max;\n point3d = new Point3d(x, yText, zRange.min);\n const msg = \" \" + this.xValueLabel(x) + \" \";\n this._drawAxisLabelX.call(this, ctx, point3d, msg, armAngle, textMargin);\n }\n\n step.next();\n }\n\n // draw y-grid lines\n ctx.lineWidth = 1;\n prettyStep = this.defaultYStep === undefined;\n step = new StepNumber(yRange.min, yRange.max, this.yStep, prettyStep);\n step.start(true);\n\n while (!step.end()) {\n const y = step.getCurrent();\n\n if (this.showGrid) {\n from = new Point3d(xRange.min, y, zRange.min);\n to = new Point3d(xRange.max, y, zRange.min);\n this._line3d(ctx, from, to, this.gridColor);\n } else if (this.showYAxis) {\n from = new Point3d(xRange.min, y, zRange.min);\n to = new Point3d(xRange.min + gridLenY, y, zRange.min);\n this._line3d(ctx, from, to, this.axisColor);\n\n from = new Point3d(xRange.max, y, zRange.min);\n to = new Point3d(xRange.max - gridLenY, y, zRange.min);\n this._line3d(ctx, from, to, this.axisColor);\n }\n\n if (this.showYAxis) {\n xText = armVector.y > 0 ? xRange.min : xRange.max;\n point3d = new Point3d(xText, y, zRange.min);\n const msg = \" \" + this.yValueLabel(y) + \" \";\n this._drawAxisLabelY.call(this, ctx, point3d, msg, armAngle, textMargin);\n }\n\n step.next();\n }\n\n // draw z-grid lines and axis\n if (this.showZAxis) {\n ctx.lineWidth = 1;\n prettyStep = this.defaultZStep === undefined;\n step = new StepNumber(zRange.min, zRange.max, this.zStep, prettyStep);\n step.start(true);\n\n xText = armVector.x > 0 ? xRange.min : xRange.max;\n yText = armVector.y < 0 ? yRange.min : yRange.max;\n\n while (!step.end()) {\n const z = step.getCurrent();\n\n // TODO: make z-grid lines really 3d?\n const from3d = new Point3d(xText, yText, z);\n const from2d = this._convert3Dto2D(from3d);\n to = new Point2d(from2d.x - textMargin, from2d.y);\n this._line(ctx, from2d, to, this.axisColor);\n\n const msg = this.zValueLabel(z) + \" \";\n this._drawAxisLabelZ.call(this, ctx, from3d, msg, 5);\n\n step.next();\n }\n\n ctx.lineWidth = 1;\n from = new Point3d(xText, yText, zRange.min);\n to = new Point3d(xText, yText, zRange.max);\n this._line3d(ctx, from, to, this.axisColor);\n }\n\n // draw x-axis\n if (this.showXAxis) {\n let xMin2d;\n let xMax2d;\n ctx.lineWidth = 1;\n\n // line at yMin\n xMin2d = new Point3d(xRange.min, yRange.min, zRange.min);\n xMax2d = new Point3d(xRange.max, yRange.min, zRange.min);\n this._line3d(ctx, xMin2d, xMax2d, this.axisColor);\n // line at ymax\n xMin2d = new Point3d(xRange.min, yRange.max, zRange.min);\n xMax2d = new Point3d(xRange.max, yRange.max, zRange.min);\n this._line3d(ctx, xMin2d, xMax2d, this.axisColor);\n }\n\n // draw y-axis\n if (this.showYAxis) {\n ctx.lineWidth = 1;\n // line at xMin\n from = new Point3d(xRange.min, yRange.min, zRange.min);\n to = new Point3d(xRange.min, yRange.max, zRange.min);\n this._line3d(ctx, from, to, this.axisColor);\n // line at xMax\n from = new Point3d(xRange.max, yRange.min, zRange.min);\n to = new Point3d(xRange.max, yRange.max, zRange.min);\n this._line3d(ctx, from, to, this.axisColor);\n }\n\n // draw x-label\n const xLabel = this.xLabel;\n if (xLabel.length > 0 && this.showXAxis) {\n yOffset = 0.1 / this.scale.y;\n xText = (xRange.max + 3 * xRange.min) / 4;\n yText = armVector.x > 0 ? yRange.min - yOffset : yRange.max + yOffset;\n text = new Point3d(xText, yText, zRange.min);\n this.drawAxisLabelX(ctx, text, xLabel, armAngle);\n }\n\n // draw y-label\n const yLabel = this.yLabel;\n if (yLabel.length > 0 && this.showYAxis) {\n xOffset = 0.1 / this.scale.x;\n xText = armVector.y > 0 ? xRange.min - xOffset : xRange.max + xOffset;\n yText = (yRange.max + 3 * yRange.min) / 4;\n text = new Point3d(xText, yText, zRange.min);\n\n this.drawAxisLabelY(ctx, text, yLabel, armAngle);\n }\n\n // draw z-label\n const zLabel = this.zLabel;\n if (zLabel.length > 0 && this.showZAxis) {\n offset = 30; // pixels. // TODO: relate to the max width of the values on the z axis?\n xText = armVector.x > 0 ? xRange.min : xRange.max;\n yText = armVector.y < 0 ? yRange.min : yRange.max;\n zText = (zRange.max + 3 * zRange.min) / 4;\n text = new Point3d(xText, yText, zText);\n\n this.drawAxisLabelZ(ctx, text, zLabel, offset);\n }\n};\n\n/**\n *\n * @param {vis.Point3d} point\n * @returns {*}\n * @private\n */\nGraph3d.prototype._getStrokeWidth = function (point) {\n if (point !== undefined) {\n if (this.showPerspective) {\n return (1 / -point.trans.z) * this.dataColor.strokeWidth;\n } else {\n return (\n -(this.eye.z / this.camera.getArmLength()) * this.dataColor.strokeWidth\n );\n }\n }\n\n return this.dataColor.strokeWidth;\n};\n\n// -----------------------------------------------------------------------------\n// Drawing primitives for the graphs\n// -----------------------------------------------------------------------------\n\n/**\n * Draw a bar element in the view with the given properties.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @param {number} xWidth\n * @param {number} yWidth\n * @param {string} color\n * @param {string} borderColor\n * @private\n */\nGraph3d.prototype._redrawBar = function (\n ctx,\n point,\n xWidth,\n yWidth,\n color,\n borderColor,\n) {\n let surface;\n\n // calculate all corner points\n const me = this;\n const point3d = point.point;\n const zMin = this.zRange.min;\n const top = [\n { point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, point3d.z) },\n { point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, point3d.z) },\n { point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, point3d.z) },\n { point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, point3d.z) },\n ];\n const bottom = [\n { point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, zMin) },\n { point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, zMin) },\n { point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, zMin) },\n { point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, zMin) },\n ];\n\n // calculate screen location of the points\n top.forEach(function (obj) {\n obj.screen = me._convert3Dto2D(obj.point);\n });\n bottom.forEach(function (obj) {\n obj.screen = me._convert3Dto2D(obj.point);\n });\n\n // create five sides, calculate both corner points and center points\n const surfaces = [\n { corners: top, center: Point3d.avg(bottom[0].point, bottom[2].point) },\n {\n corners: [top[0], top[1], bottom[1], bottom[0]],\n center: Point3d.avg(bottom[1].point, bottom[0].point),\n },\n {\n corners: [top[1], top[2], bottom[2], bottom[1]],\n center: Point3d.avg(bottom[2].point, bottom[1].point),\n },\n {\n corners: [top[2], top[3], bottom[3], bottom[2]],\n center: Point3d.avg(bottom[3].point, bottom[2].point),\n },\n {\n corners: [top[3], top[0], bottom[0], bottom[3]],\n center: Point3d.avg(bottom[0].point, bottom[3].point),\n },\n ];\n point.surfaces = surfaces;\n\n // calculate the distance of each of the surface centers to the camera\n for (let j = 0; j < surfaces.length; j++) {\n surface = surfaces[j];\n const transCenter = this._convertPointToTranslation(surface.center);\n surface.dist = this.showPerspective ? transCenter.length() : -transCenter.z;\n // TODO: this dept calculation doesn't work 100% of the cases due to perspective,\n // but the current solution is fast/simple and works in 99.9% of all cases\n // the issue is visible in example 14, with graph.setCameraPosition({horizontal: 2.97, vertical: 0.5, distance: 0.9})\n }\n\n // order the surfaces by their (translated) depth\n surfaces.sort(function (a, b) {\n const diff = b.dist - a.dist;\n if (diff) return diff;\n\n // if equal depth, sort the top surface last\n if (a.corners === top) return 1;\n if (b.corners === top) return -1;\n\n // both are equal\n return 0;\n });\n\n // draw the ordered surfaces\n ctx.lineWidth = this._getStrokeWidth(point);\n ctx.strokeStyle = borderColor;\n ctx.fillStyle = color;\n // NOTE: we start at j=2 instead of j=0 as we don't need to draw the two surfaces at the backside\n for (let j = 2; j < surfaces.length; j++) {\n surface = surfaces[j];\n this._polygon(ctx, surface.corners);\n }\n};\n\n/**\n * Draw a polygon using the passed points and fill it with the passed style and stroke.\n * @param {CanvasRenderingContext2D} ctx\n * @param {Array.<vis.Point3d>} points an array of points.\n * @param {string} [fillStyle] the fill style to set\n * @param {string} [strokeStyle] the stroke style to set\n */\nGraph3d.prototype._polygon = function (ctx, points, fillStyle, strokeStyle) {\n if (points.length < 2) {\n return;\n }\n\n if (fillStyle !== undefined) {\n ctx.fillStyle = fillStyle;\n }\n if (strokeStyle !== undefined) {\n ctx.strokeStyle = strokeStyle;\n }\n ctx.beginPath();\n ctx.moveTo(points[0].screen.x, points[0].screen.y);\n\n for (let i = 1; i < points.length; ++i) {\n const point = points[i];\n ctx.lineTo(point.screen.x, point.screen.y);\n }\n\n ctx.closePath();\n ctx.fill();\n ctx.stroke(); // TODO: only draw stroke when strokeWidth > 0\n};\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @param {string} color\n * @param {string} borderColor\n * @param {number} [size]\n * @private\n */\nGraph3d.prototype._drawCircle = function (\n ctx,\n point,\n color,\n borderColor,\n size,\n) {\n const radius = this._calcRadius(point, size);\n\n ctx.lineWidth = this._getStrokeWidth(point);\n ctx.strokeStyle = borderColor;\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.arc(point.screen.x, point.screen.y, radius, 0, Math.PI * 2, true);\n ctx.fill();\n ctx.stroke();\n};\n\n/**\n * Determine the colors for the 'regular' graph styles.\n * @param {object} point\n * @returns {{fill, border}}\n * @private\n */\nGraph3d.prototype._getColorsRegular = function (point) {\n const f = (point.point.value - this.valueRange.min) * this.scale.value;\n const color = this._colormap(f, 1);\n const borderColor = this._colormap(f, 0.8);\n return {\n fill: color,\n border: borderColor,\n };\n};\n\n/**\n * Get the colors for the 'color' graph styles.\n * These styles are currently: 'bar-color' and 'dot-color'\n * Color may be set as a string representation of HTML color, like #ff00ff,\n * or calculated from a number, for example, distance from this point\n * The first option is useful when we have some pre-given legend, to which we have to adjust ourselves\n * The second option is useful when we are interested in automatically setting the color, from some value,\n * using some color scale\n * @param {object} point\n * @returns {{fill: *, border: *}}\n * @private\n */\nGraph3d.prototype._getColorsColor = function (point) {\n // calculate the color based on the value\n let color, borderColor, pointStyle;\n if (point && point.point && point.point.data && point.point.data.style) {\n pointStyle = point.point.data.style;\n }\n if (\n pointStyle &&\n typeof pointStyle === \"object\" &&\n pointStyle.fill &&\n pointStyle.stroke\n ) {\n return {\n fill: pointStyle.fill,\n border: pointStyle.stroke,\n };\n }\n\n if (typeof point.point.value === \"string\") {\n color = point.point.value;\n borderColor = point.point.value;\n } else {\n const f = (point.point.value - this.valueRange.min) * this.scale.value;\n color = this._colormap(f, 1);\n borderColor = this._colormap(f, 0.8);\n }\n return {\n fill: color,\n border: borderColor,\n };\n};\n\n/**\n * Get the colors for the 'size' graph styles.\n * These styles are currently: 'bar-size' and 'dot-size'\n * @returns {{fill: *, border: (string|colorOptions.stroke|{string, undefined}|string|colorOptions.stroke|{string}|*)}}\n * @private\n */\nGraph3d.prototype._getColorsSize = function () {\n return {\n fill: this.dataColor.fill,\n border: this.dataColor.stroke,\n };\n};\n\n/**\n * Determine the color corresponding to a given value on the color scale.\n * @param {number} [x] the data value to be mapped running from 0 to 1\n * @param {number} [v] scale factor between 0 and 1 for the color brightness\n * @returns {string}\n * @private\n */\nGraph3d.prototype._colormap = function (x, v = 1) {\n let r, g, b, a;\n const colormap = this.colormap;\n if (Array.isArray(colormap)) {\n const maxIndex = colormap.length - 1;\n const startIndex = Math.max(Math.floor(x * maxIndex), 0);\n const endIndex = Math.min(startIndex + 1, maxIndex);\n const innerRatio = x * maxIndex - startIndex;\n const min = colormap[startIndex];\n const max = colormap[endIndex];\n r = min.r + innerRatio * (max.r - min.r);\n g = min.g + innerRatio * (max.g - min.g);\n b = min.b + innerRatio * (max.b - min.b);\n } else if (typeof colormap === \"function\") {\n ({ r, g, b, a } = colormap(x));\n } else {\n const hue = (1 - x) * 240;\n ({ r, g, b } = util.HSVToRGB(hue / 360, 1, 1));\n }\n if (typeof a === \"number\" && !Number.isNaN(a)) {\n return `RGBA(${Math.round(r * v)}, ${Math.round(g * v)}, ${Math.round(\n b * v,\n )}, ${a})`;\n } else {\n return `RGB(${Math.round(r * v)}, ${Math.round(g * v)}, ${Math.round(\n b * v,\n )})`;\n }\n};\n\n/**\n * Determine the size of a point on-screen, as determined by the\n * distance to the camera.\n * @param {object} point\n * @param {number} [size] the size that needs to be translated to screen coordinates.\n * optional; if not passed, use the default point size.\n * @returns {number}\n * @private\n */\nGraph3d.prototype._calcRadius = function (point, size) {\n if (size === undefined) {\n size = this._dotSize();\n }\n\n let radius;\n if (this.showPerspective) {\n radius = size / -point.trans.z;\n } else {\n radius = size * -(this.eye.z / this.camera.getArmLength());\n }\n if (radius < 0) {\n radius = 0;\n }\n\n return radius;\n};\n\n// -----------------------------------------------------------------------------\n// Methods for drawing points per graph style.\n// -----------------------------------------------------------------------------\n\n/**\n * Draw single datapoint for graph style 'bar'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawBarGraphPoint = function (ctx, point) {\n const xWidth = this.xBarWidth / 2;\n const yWidth = this.yBarWidth / 2;\n const colors = this._getColorsRegular(point);\n\n this._redrawBar(ctx, point, xWidth, yWidth, colors.fill, colors.border);\n};\n\n/**\n * Draw single datapoint for graph style 'bar-color'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawBarColorGraphPoint = function (ctx, point) {\n const xWidth = this.xBarWidth / 2;\n const yWidth = this.yBarWidth / 2;\n const colors = this._getColorsColor(point);\n\n this._redrawBar(ctx, point, xWidth, yWidth, colors.fill, colors.border);\n};\n\n/**\n * Draw single datapoint for graph style 'bar-size'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawBarSizeGraphPoint = function (ctx, point) {\n // calculate size for the bar\n const fraction =\n (point.point.value - this.valueRange.min) / this.valueRange.range();\n const xWidth = (this.xBarWidth / 2) * (fraction * 0.8 + 0.2);\n const yWidth = (this.yBarWidth / 2) * (fraction * 0.8 + 0.2);\n\n const colors = this._getColorsSize();\n\n this._redrawBar(ctx, point, xWidth, yWidth, colors.fill, colors.border);\n};\n\n/**\n * Draw single datapoint for graph style 'dot'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawDotGraphPoint = function (ctx, point) {\n const colors = this._getColorsRegular(point);\n\n this._drawCircle(ctx, point, colors.fill, colors.border);\n};\n\n/**\n * Draw single datapoint for graph style 'dot-line'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawDotLineGraphPoint = function (ctx, point) {\n // draw a vertical line from the XY-plane to the graph value\n const from = this._convert3Dto2D(point.bottom);\n ctx.lineWidth = 1;\n this._line(ctx, from, point.screen, this.gridColor);\n\n this._redrawDotGraphPoint(ctx, point);\n};\n\n/**\n * Draw single datapoint for graph style 'dot-color'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawDotColorGraphPoint = function (ctx, point) {\n const colors = this._getColorsColor(point);\n\n this._drawCircle(ctx, point, colors.fill, colors.border);\n};\n\n/**\n * Draw single datapoint for graph style 'dot-size'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawDotSizeGraphPoint = function (ctx, point) {\n const dotSize = this._dotSize();\n const fraction =\n (point.point.value - this.valueRange.min) / this.valueRange.range();\n\n const sizeMin = dotSize * this.dotSizeMinFraction;\n const sizeRange = dotSize * this.dotSizeMaxFraction - sizeMin;\n const size = sizeMin + sizeRange * fraction;\n\n const colors = this._getColorsSize();\n\n this._drawCircle(ctx, point, colors.fill, colors.border, size);\n};\n\n/**\n * Draw single datapoint for graph style 'surface'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawSurfaceGraphPoint = function (ctx, point) {\n const right = point.pointRight;\n const top = point.pointTop;\n const cross = point.pointCross;\n\n if (\n point === undefined ||\n right === undefined ||\n top === undefined ||\n cross === undefined\n ) {\n return;\n }\n\n let topSideVisible = true;\n let fillStyle;\n let strokeStyle;\n let cosViewAngle;\n\n if (this.showGrayBottom || this.showShadow) {\n // calculate the cross product of the two vectors from center\n // to left and right, in order to know whether we are looking at the\n // bottom or at the top side. We can also use the cross product\n // for calculating light intensity\n const aDiff = Point3d.subtract(cross.trans, point.trans);\n const bDiff = Point3d.subtract(top.trans, right.trans);\n const surfaceNormal = Point3d.crossProduct(aDiff, bDiff);\n\n if (this.showPerspective) {\n const surfacePosition = Point3d.avg(\n Point3d.avg(point.trans, cross.trans),\n Point3d.avg(right.trans, top.trans),\n );\n // This corresponds to diffuse lighting with light source at (0, 0, 0).\n // More generally, we would need `surfacePosition - lightPosition`:\n cosViewAngle = -Point3d.dotProduct(\n surfaceNormal.normalize(),\n surfacePosition.normalize(),\n );\n } else {\n cosViewAngle = surfaceNormal.z / surfaceNormal.length();\n }\n topSideVisible = cosViewAngle > 0;\n }\n\n if (topSideVisible || !this.showGrayBottom) {\n const vAvg =\n (point.point.value +\n right.point.value +\n top.point.value +\n cross.point.value) /\n 4;\n const ratio = (vAvg - this.valueRange.min) * this.scale.value;\n // lighting factor. TODO: let user specify lighting model as function(?)\n const v = this.showShadow ? (1 + cosViewAngle) / 2 : 1;\n fillStyle = this._colormap(ratio, v);\n } else {\n fillStyle = \"gray\";\n }\n\n if (this.showSurfaceGrid) {\n strokeStyle = this.axisColor; // TODO: should be customizable\n } else {\n strokeStyle = fillStyle;\n }\n\n ctx.lineWidth = this._getStrokeWidth(point);\n // TODO: only draw stroke when strokeWidth > 0\n\n const points = [point, right, cross, top];\n this._polygon(ctx, points, fillStyle, strokeStyle);\n};\n\n/**\n * Helper method for _redrawGridGraphPoint()\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} from\n * @param {object} to\n * @private\n */\nGraph3d.prototype._drawGridLine = function (ctx, from, to) {\n if (from === undefined || to === undefined) {\n return;\n }\n\n const vAvg = (from.point.value + to.point.value) / 2;\n const f = (vAvg - this.valueRange.min) * this.scale.value;\n\n ctx.lineWidth = this._getStrokeWidth(from) * 2;\n ctx.strokeStyle = this._colormap(f, 1);\n this._line(ctx, from.screen, to.screen);\n};\n\n/**\n * Draw single datapoint for graph style 'Grid'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawGridGraphPoint = function (ctx, point) {\n this._drawGridLine(ctx, point, point.pointRight);\n this._drawGridLine(ctx, point, point.pointTop);\n};\n\n/**\n * Draw single datapoint for graph style 'line'.\n * @param {CanvasRenderingContext2D} ctx\n * @param {object} point\n * @private\n */\nGraph3d.prototype._redrawLineGraphPoint = function (ctx, point) {\n if (point.pointNext === undefined) {\n return;\n }\n\n ctx.lineWidth = this._getStrokeWidth(point);\n ctx.strokeStyle = this.dataColor.stroke;\n\n this._line(ctx, point.screen, point.pointNext.screen);\n};\n\n/**\n * Draw all datapoints for currently selected graph style.\n *\n */\nGraph3d.prototype._redrawDataGraph = function () {\n const ctx = this._getContext();\n let i;\n\n if (this.dataPoints === undefined || this.dataPoints.length <= 0) return; // TODO: throw exception?\n\n this._calcTranslations(this.dataPoints);\n\n for (i = 0; i < this.dataPoints.length; i++) {\n const point = this.dataPoints[i];\n\n // Using call() ensures that the correct context is used\n this._pointDrawingMethod.call(this, ctx, point);\n }\n};\n\n// -----------------------------------------------------------------------------\n// End methods for drawing points per graph style.\n// -----------------------------------------------------------------------------\n\n/**\n * Store startX, startY and startOffset for mouse operations\n * @param {Event} event The event that occurred\n */\nGraph3d.prototype._storeMousePosition = function (event) {\n // get mouse position (different code for IE and all other browsers)\n this.startMouseX = getMouseX(event);\n this.startMouseY = getMouseY(event);\n\n this._startCameraOffset = this.camera.getOffset();\n};\n\n/**\n * Start a moving operation inside the provided parent element\n * @param {Event} event The event that occurred (required for\n * retrieving the mouse position)\n */\nGraph3d.prototype._onMouseDown = function (event) {\n event = event || window.event;\n\n // check if mouse is still down (may be up when focus is lost for example\n // in an iframe)\n if (this.leftButtonDown) {\n this._onMouseUp(event);\n }\n\n // only react on left mouse button down\n this.leftButtonDown = event.which ? event.which === 1 : event.button === 1;\n if (!this.leftButtonDown && !this.touchDown) return;\n\n this._storeMousePosition(event);\n\n this.startStart = new Date(this.start);\n this.startEnd = new Date(this.end);\n this.startArmRotation = this.camera.getArmRotation();\n\n this.frame.style.cursor = \"move\";\n\n // add event listeners to handle moving the contents\n // we store the function onmousemove and onmouseup in the graph, so we can\n // remove the eventlisteners lateron in the function mouseUp()\n const me = this;\n this.onmousemove = function (event) {\n me._onMouseMove(event);\n };\n this.onmouseup = function (event) {\n me._onMouseUp(event);\n };\n document.addEventListener(\"mousemove\", me.onmousemove);\n document.addEventListener(\"mouseup\", me.onmouseup);\n util.preventDefault(event);\n};\n\n/**\n * Perform moving operating.\n * This function activated from within the funcion Graph.mouseDown().\n * @param {Event} event Well, eehh, the event\n */\nGraph3d.prototype._onMouseMove = function (event) {\n this.moving = true;\n event = event || window.event;\n\n // calculate change in mouse position\n const diffX = parseFloat(getMouseX(event)) - this.startMouseX;\n const diffY = parseFloat(getMouseY(event)) - this.startMouseY;\n\n // move with ctrl or rotate by other\n if (event && event.ctrlKey === true) {\n // calculate change in mouse position\n const scaleX = this.frame.clientWidth * 0.5;\n const scaleY = this.frame.clientHeight * 0.5;\n\n const offXNew =\n (this._startCameraOffset.x || 0) -\n (diffX / scaleX) * this.camera.armLength * 0.8;\n const offYNew =\n (this._startCameraOffset.y || 0) +\n (diffY / scaleY) * this.camera.armLength * 0.8;\n\n this.camera.setOffset(offXNew, offYNew);\n this._storeMousePosition(event);\n } else {\n let horizontalNew = this.startArmRotation.horizontal + diffX / 200;\n let verticalNew = this.startArmRotation.vertical + diffY / 200;\n\n const snapAngle = 4; // degrees\n const snapValue = Math.sin((snapAngle / 360) * 2 * Math.PI);\n\n // snap horizontally to nice angles at 0pi, 0.5pi, 1pi, 1.5pi, etc...\n // the -0.001 is to take care that the vertical axis is always drawn at the left front corner\n if (Math.abs(Math.sin(horizontalNew)) < snapValue) {\n horizontalNew = Math.round(horizontalNew / Math.PI) * Math.PI - 0.001;\n }\n if (Math.abs(Math.cos(horizontalNew)) < snapValue) {\n horizontalNew =\n (Math.round(horizontalNew / Math.PI - 0.5) + 0.5) * Math.PI - 0.001;\n }\n\n // snap vertically to nice angles\n if (Math.abs(Math.sin(verticalNew)) < snapValue) {\n verticalNew = Math.round(verticalNew / Math.PI) * Math.PI;\n }\n if (Math.abs(Math.cos(verticalNew)) < snapValue) {\n verticalNew = (Math.round(verticalNew / Math.PI - 0.5) + 0.5) * Math.PI;\n }\n this.camera.setArmRotation(horizontalNew, verticalNew);\n }\n\n this.redraw();\n\n // fire a cameraPositionChange event\n const parameters = this.getCameraPosition();\n this.emit(\"cameraPositionChange\", parameters);\n\n util.preventDefault(event);\n};\n\n/**\n * Stop moving operating.\n * This function activated from within the funcion Graph.mouseDown().\n * @param {Event} event The event\n */\nGraph3d.prototype._onMouseUp = function (event) {\n this.frame.style.cursor = \"auto\";\n this.leftButtonDown = false;\n\n // remove event listeners here\n document.removeEventListener(\"mousemove\", this.onmousemove);\n document.removeEventListener(\"mouseup\", this.onmouseup);\n\n util.preventDefault(event);\n};\n\n/**\n * @param {Event} event The event\n */\nGraph3d.prototype._onClick = function (event) {\n // NOTE: onclick_callback is deprecated and may be removed in a future version.\n if (!this.onclick_callback && !this.hasListeners(\"click\")) return;\n if (!this.moving) {\n const boundingRect = this.frame.getBoundingClientRect();\n const mouseX = getMouseX(event) - boundingRect.left;\n const mouseY = getMouseY(event) - boundingRect.top;\n const dataPoint = this._dataPointFromXY(mouseX, mouseY);\n if (dataPoint) {\n if (this.onclick_callback) this.onclick_callback(dataPoint.point.data);\n this.emit(\"click\", dataPoint.point.data);\n }\n } else {\n // disable onclick callback, if it came immediately after rotate/pan\n this.moving = false;\n }\n util.preventDefault(event);\n};\n\n/**\n * After having moved the mouse, a tooltip should pop up when the mouse is resting on a data point\n * @param {Event} event A mouse move event\n */\nGraph3d.prototype._onTooltip = function (event) {\n const delay = this.tooltipDelay; // ms\n const boundingRect = this.frame.getBoundingClientRect();\n const mouseX = getMouseX(event) - boundingRect.left;\n const mouseY = getMouseY(event) - boundingRect.top;\n\n if (!this.showTooltip) {\n return;\n }\n\n if (this.tooltipTimeout) {\n clearTimeout(this.tooltipTimeout);\n }\n\n // (delayed) display of a tooltip only if no mouse button is down\n if (this.leftButtonDown) {\n this._hideTooltip();\n return;\n }\n\n if (this.tooltip && this.tooltip.dataPoint) {\n // tooltip is currently visible\n const dataPoint = this._dataPointFromXY(mouseX, mouseY);\n if (dataPoint !== this.tooltip.dataPoint) {\n // datapoint changed\n if (dataPoint) {\n this._showTooltip(dataPoint);\n } else {\n this._hideTooltip();\n }\n }\n } else {\n // tooltip is currently not visible\n const me = this;\n this.tooltipTimeout = setTimeout(function () {\n me.tooltipTimeout = null;\n\n // show a tooltip if we have a data point\n const dataPoint = me._dataPointFromXY(mouseX, mouseY);\n if (dataPoint) {\n me._showTooltip(dataPoint);\n }\n }, delay);\n }\n};\n\n/**\n * Event handler for touchstart event on mobile devices\n * @param {Event} event The event\n */\nGraph3d.prototype._onTouchStart = function (event) {\n this.touchDown = true;\n\n const me = this;\n this.ontouchmove = function (event) {\n me._onTouchMove(event);\n };\n this.ontouchend = function (event) {\n me._onTouchEnd(event);\n };\n document.addEventListener(\"touchmove\", me.ontouchmove);\n document.addEventListener(\"touchend\", me.ontouchend);\n\n this._onMouseDown(event);\n};\n\n/**\n * Event handler for touchmove event on mobile devices\n * @param {Event} event The event\n */\nGraph3d.prototype._onTouchMove = function (event) {\n this._onMouseMove(event);\n};\n\n/**\n * Event handler for touchend event on mobile devices\n * @param {Event} event The event\n */\nGraph3d.prototype._onTouchEnd = function (event) {\n this.touchDown = false;\n\n document.removeEventListener(\"touchmove\", this.ontouchmove);\n document.removeEventListener(\"touchend\", this.ontouchend);\n\n this._onMouseUp(event);\n};\n\n/**\n * Event handler for mouse wheel event, used to zoom the graph\n * Code from http://adomas.org/javascript-mouse-wheel/\n * @param {Event} event The event\n */\nGraph3d.prototype._onWheel = function (event) {\n if (!event) /* For IE. */ event = window.event;\n if (this.zoomable && (!this.ctrlToZoom || event.ctrlKey)) {\n // retrieve delta\n let delta = 0;\n if (event.wheelDelta) {\n /* IE/Opera. */\n delta = event.wheelDelta / 120;\n } else if (event.detail) {\n /* Mozilla case. */\n // In Mozilla, sign of delta is different than in IE.\n // Also, delta is multiple of 3.\n delta = -event.detail / 3;\n }\n\n // If delta is nonzero, handle it.\n // Basically, delta is now positive if wheel was scrolled up,\n // and negative, if wheel was scrolled down.\n if (delta) {\n const oldLength = this.camera.getArmLength();\n const newLength = oldLength * (1 - delta / 10);\n\n this.camera.setArmLength(newLength);\n this.redraw();\n\n this._hideTooltip();\n }\n\n // fire a cameraPositionChange event\n const parameters = this.getCameraPosition();\n this.emit(\"cameraPositionChange\", parameters);\n\n // Prevent default actions caused by mouse wheel.\n // That might be ugly, but we handle scrolls somehow\n // anyway, so don't bother here..\n util.preventDefault(event);\n }\n};\n\n/**\n * Test whether a point lies inside given 2D triangle\n * @param {vis.Point2d} point\n * @param {vis.Point2d[]} triangle\n * @returns {boolean} true if given point lies inside or on the edge of the\n * triangle, false otherwise\n * @private\n */\nGraph3d.prototype._insideTriangle = function (point, triangle) {\n const a = triangle[0],\n b = triangle[1],\n c = triangle[2];\n\n /**\n *\n * @param {number} x\n * @returns {number}\n */\n function sign(x) {\n return x > 0 ? 1 : x < 0 ? -1 : 0;\n }\n\n const as = sign(\n (b.x - a.x) * (point.y - a.y) - (b.y - a.y) * (point.x - a.x),\n );\n const bs = sign(\n (c.x - b.x) * (point.y - b.y) - (c.y - b.y) * (point.x - b.x),\n );\n const cs = sign(\n (a.x - c.x) * (point.y - c.y) - (a.y - c.y) * (point.x - c.x),\n );\n\n // each of the three signs must be either equal to each other or zero\n return (\n (as == 0 || bs == 0 || as == bs) &&\n (bs == 0 || cs == 0 || bs == cs) &&\n (as == 0 || cs == 0 || as == cs)\n );\n};\n\n/**\n * Find a data point close to given screen position (x, y)\n * @param {number} x\n * @param {number} y\n * @returns {object | null} The closest data point or null if not close to any\n * data point\n * @private\n */\nGraph3d.prototype._dataPointFromXY = function (x, y) {\n const distMax = 100; // px\n const center = new Point2d(x, y);\n let i,\n dataPoint = null,\n closestDataPoint = null,\n closestDist = null;\n\n if (\n this.style === Graph3d.STYLE.BAR ||\n this.style === Graph3d.STYLE.BARCOLOR ||\n this.style === Graph3d.STYLE.BARSIZE\n ) {\n // the data points are ordered from far away to closest\n for (i = this.dataPoints.length - 1; i >= 0; i--) {\n dataPoint = this.dataPoints[i];\n const surfaces = dataPoint.surfaces;\n if (surfaces) {\n for (let s = surfaces.length - 1; s >= 0; s--) {\n // split each surface in two triangles, and see if the center point is inside one of these\n const surface = surfaces[s];\n const corners = surface.corners;\n const triangle1 = [\n corners[0].screen,\n corners[1].screen,\n corners[2].screen,\n ];\n const triangle2 = [\n corners[2].screen,\n corners[3].screen,\n corners[0].screen,\n ];\n if (\n this._insideTriangle(center, triangle1) ||\n this._insideTriangle(center, triangle2)\n ) {\n // return immediately at the first hit\n return dataPoint;\n }\n }\n }\n }\n } else {\n // find the closest data point, using distance to the center of the point on 2d screen\n for (i = 0; i < this.dataPoints.length; i++) {\n dataPoint = this.dataPoints[i];\n const point = dataPoint.screen;\n if (point) {\n const distX = Math.abs(x - point.x);\n const distY = Math.abs(y - point.y);\n const dist = Math.sqrt(distX * distX + distY * distY);\n\n if ((closestDist === null || dist < closestDist) && dist < distMax) {\n closestDist = dist;\n closestDataPoint = dataPoint;\n }\n }\n }\n }\n\n return closestDataPoint;\n};\n\n/**\n * Determine if the given style has bars\n * @param {number} style the style to check\n * @returns {boolean} true if bar style, false otherwise\n */\nGraph3d.prototype.hasBars = function (style) {\n return (\n style == Graph3d.STYLE.BAR ||\n style == Graph3d.STYLE.BARCOLOR ||\n style == Graph3d.STYLE.BARSIZE\n );\n};\n\n/**\n * Display a tooltip for given data point\n * @param {object} dataPoint\n * @private\n */\nGraph3d.prototype._showTooltip = function (dataPoint) {\n let content, line, dot;\n\n if (!this.tooltip) {\n content = document.createElement(\"div\");\n Object.assign(content.style, {}, this.tooltipStyle.content);\n content.style.position = \"absolute\";\n\n line = document.createElement(\"div\");\n Object.assign(line.style, {}, this.tooltipStyle.line);\n line.style.position = \"absolute\";\n\n dot = document.createElement(\"div\");\n Object.assign(dot.style, {}, this.tooltipStyle.dot);\n dot.style.position = \"absolute\";\n\n this.tooltip = {\n dataPoint: null,\n dom: {\n content: content,\n line: line,\n dot: dot,\n },\n };\n } else {\n content = this.tooltip.dom.content;\n line = this.tooltip.dom.line;\n dot = this.tooltip.dom.dot;\n }\n\n this._hideTooltip();\n\n this.tooltip.dataPoint = dataPoint;\n if (typeof this.showTooltip === \"function\") {\n content.innerHTML = this.showTooltip(dataPoint.point);\n } else {\n content.innerHTML =\n \"<table>\" +\n \"<tr><td>\" +\n this.xLabel +\n \":</td><td>\" +\n dataPoint.point.x +\n \"</td></tr>\" +\n \"<tr><td>\" +\n this.yLabel +\n \":</td><td>\" +\n dataPoint.point.y +\n \"</td></tr>\" +\n \"<tr><td>\" +\n this.zLabel +\n \":</td><td>\" +\n dataPoint.point.z +\n \"</td></tr>\" +\n \"</table>\";\n }\n\n content.style.left = \"0\";\n content.style.top = \"0\";\n this.frame.appendChild(content);\n this.frame.appendChild(line);\n this.frame.appendChild(dot);\n\n // calculate sizes\n const contentWidth = content.offsetWidth;\n const contentHeight = content.offsetHeight;\n const lineHeight = line.offsetHeight;\n const dotWidth = dot.offsetWidth;\n const dotHeight = dot.offsetHeight;\n\n let left = dataPoint.screen.x - contentWidth / 2;\n left = Math.min(\n Math.max(left, 10),\n this.frame.clientWidth - 10 - contentWidth,\n );\n\n line.style.left = dataPoint.screen.x + \"px\";\n line.style.top = dataPoint.screen.y - lineHeight + \"px\";\n content.style.left = left + \"px\";\n content.style.top = dataPoint.screen.y - lineHeight - contentHeight + \"px\";\n dot.style.left = dataPoint.screen.x - dotWidth / 2 + \"px\";\n dot.style.top = dataPoint.screen.y - dotHeight / 2 + \"px\";\n};\n\n/**\n * Hide the tooltip when displayed\n * @private\n */\nGraph3d.prototype._hideTooltip = function () {\n if (this.tooltip) {\n this.tooltip.dataPoint = null;\n\n for (const prop in this.tooltip.dom) {\n if (Object.prototype.hasOwnProperty.call(this.tooltip.dom, prop)) {\n const elem = this.tooltip.dom[prop];\n if (elem && elem.parentNode) {\n elem.parentNode.removeChild(elem);\n }\n }\n }\n }\n};\n\n/**--------------------------------------------------------------------------**/\n\n/**\n * Get the horizontal mouse position from a mouse event\n * @param {Event} event\n * @returns {number} mouse x\n */\nfunction getMouseX(event) {\n if (\"clientX\" in event) return event.clientX;\n return (event.targetTouches[0] && event.targetTouches[0].clientX) || 0;\n}\n\n/**\n * Get the vertical mouse position from a mouse event\n * @param {Event} event\n * @returns {number} mouse y\n */\nfunction getMouseY(event) {\n if (\"clientY\" in event) return event.clientY;\n return (event.targetTouches[0] && event.targetTouches[0].clientY) || 0;\n}\n\n// -----------------------------------------------------------------------------\n// Public methods for specific settings\n// -----------------------------------------------------------------------------\n\n/**\n * Set the rotation and distance of the camera\n * @param {object} pos An object with the camera position\n * @param {number} [pos.horizontal] The horizontal rotation, between 0 and 2*PI.\n * Optional, can be left undefined.\n * @param {number} [pos.vertical] The vertical rotation, between 0 and 0.5*PI.\n * if vertical=0.5*PI, the graph is shown from\n * the top. Optional, can be left undefined.\n * @param {number} [pos.distance] The (normalized) distance of the camera to the\n * center of the graph, a value between 0.71 and\n * 5.0. Optional, can be left undefined.\n */\nGraph3d.prototype.setCameraPosition = function (pos) {\n setCameraPosition(pos, this);\n this.redraw();\n};\n\n/**\n * Set a new size for the graph\n * @param {string} width Width in pixels or percentage (for example '800px'\n * or '50%')\n * @param {string} height Height in pixels or percentage (for example '400px'\n * or '30%')\n */\nGraph3d.prototype.setSize = function (width, height) {\n this._setSize(width, height);\n this.redraw();\n};\n\n// -----------------------------------------------------------------------------\n// End public methods for specific settings\n// -----------------------------------------------------------------------------\n\nexport default Graph3d;\n"],"names":[],"mappings":"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"}