From 9068017e539e65312441921aa08fae044e60d96a Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 18 Jun 2020 16:24:54 -0400 Subject: [PATCH 1/2] no longer depend on cwise and optimize for 2d operations --- package-lock.json | 319 +--------------------------------- package.json | 3 +- src/traces/surface/convert.js | 66 +++++-- 3 files changed, 62 insertions(+), 326 deletions(-) diff --git a/package-lock.json b/package-lock.json index c775522fca4..cb69e755fcc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -389,16 +389,6 @@ "uri-js": "^4.2.2" } }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, "almost-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz", @@ -425,7 +415,8 @@ "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true }, "ansi-escapes": { "version": "4.3.1", @@ -1597,11 +1588,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, "camelcase-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", @@ -1649,15 +1635,6 @@ "resolved": "https://registry.npmjs.org/cell-orientation/-/cell-orientation-1.0.1.tgz", "integrity": "sha1-tQStlqZq0obZ7dmFoiU9A7gNKFA=" }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -1852,16 +1829,6 @@ "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -2409,17 +2376,6 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "cwise": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/cwise/-/cwise-1.0.10.tgz", - "integrity": "sha1-JO7mBy69/WuMb12tsXCQtkmxK+8=", - "requires": { - "cwise-compiler": "^1.1.1", - "cwise-parser": "^1.0.0", - "static-module": "^1.0.0", - "uglify-js": "^2.6.0" - } - }, "cwise-compiler": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz", @@ -2428,22 +2384,6 @@ "uniq": "^1.0.0" } }, - "cwise-parser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cwise-parser/-/cwise-parser-1.0.3.tgz", - "integrity": "sha1-jkk8F9VPl8sDCp6YVLyGyd+zVP4=", - "requires": { - "esprima": "^1.0.3", - "uniq": "^1.0.0" - }, - "dependencies": { - "esprima": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", - "integrity": "sha1-CZNQL+r2aBODJXVvMPmlH+7sEek=" - } - } - }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -2569,7 +2509,8 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true }, "decimal.js": { "version": "10.2.0", @@ -3184,27 +3125,6 @@ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -6739,6 +6659,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -6753,11 +6674,6 @@ "stream-splicer": "^2.0.0" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -6848,11 +6764,6 @@ "streamroller": "^2.2.4" } }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -7742,15 +7653,6 @@ "dup": "^1.0.0" } }, - "ndarray-homography": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ndarray-homography/-/ndarray-homography-1.0.0.tgz", - "integrity": "sha1-w1UW6oa8KGK06ASiNqJwcwn+KWs=", - "requires": { - "gl-matrix-invert": "^1.0.0", - "ndarray-warp": "^1.0.0" - } - }, "ndarray-linear-interpolate": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ndarray-linear-interpolate/-/ndarray-linear-interpolate-1.0.0.tgz", @@ -7791,15 +7693,6 @@ "typedarray-pool": "^1.0.0" } }, - "ndarray-warp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ndarray-warp/-/ndarray-warp-1.0.1.tgz", - "integrity": "sha1-qKElqqu6C+v5O9bKg+ar1oIqNOA=", - "requires": { - "cwise": "^1.0.4", - "ndarray-linear-interpolate": "^1.0.0" - } - }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -8900,44 +8793,6 @@ "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" }, - "quote-stream": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-0.0.0.tgz", - "integrity": "sha1-zeKelMQJsW4Z3HCYuJtmWPlyHTs=", - "requires": { - "minimist": "0.0.8", - "through2": "~0.4.1" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" - }, - "through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~2.1.1" - } - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, "raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", @@ -9487,14 +9342,6 @@ "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", "dev": true }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "^0.1.1" - } - }, "right-now": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", @@ -10445,118 +10292,6 @@ } } }, - "static-module": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-1.5.0.tgz", - "integrity": "sha1-J9qYg8QajNCSNvhC8MHrxu32PYY=", - "requires": { - "concat-stream": "~1.6.0", - "duplexer2": "~0.0.2", - "escodegen": "~1.3.2", - "falafel": "^2.1.0", - "has": "^1.0.0", - "object-inspect": "~0.4.0", - "quote-stream": "~0.0.0", - "readable-stream": "~1.0.27-1", - "shallow-copy": "~0.0.1", - "static-eval": "~0.2.0", - "through2": "~0.4.1" - }, - "dependencies": { - "escodegen": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", - "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", - "requires": { - "esprima": "~1.1.1", - "estraverse": "~1.5.0", - "esutils": "~1.0.0", - "source-map": "~0.1.33" - } - }, - "esprima": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz", - "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=" - }, - "estraverse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", - "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=" - }, - "esutils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", - "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=" - }, - "object-inspect": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-0.4.0.tgz", - "integrity": "sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w=" - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "static-eval": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-0.2.4.tgz", - "integrity": "sha1-t9NNg4k3uWn5ZBygfUj47eJj6ns=", - "requires": { - "escodegen": "~0.0.24" - }, - "dependencies": { - "escodegen": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz", - "integrity": "sha1-Dk/xcV8yh3XWyrUaxEpAbNer/9M=", - "requires": { - "esprima": "~1.0.2", - "estraverse": "~1.3.0", - "source-map": ">= 0.1.2" - } - }, - "esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" - }, - "estraverse": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz", - "integrity": "sha1-N8K4k+8T1yPydth41g2FNRUqbEI=" - } - } - }, - "through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~2.1.1" - } - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -11585,29 +11320,6 @@ "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", "dev": true }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true - }, "umd": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", @@ -12936,21 +12648,11 @@ "string-width": "^1.0.2 || 2" } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, "world-calendars": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz", @@ -13089,17 +12791,6 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - }, "yargs-parser": { "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", diff --git a/package.json b/package.json index 0318288eafb..2a18e515a97 100644 --- a/package.json +++ b/package.json @@ -80,6 +80,7 @@ "gl-heatmap2d": "^1.0.6", "gl-line3d": "1.2.1", "gl-mat4": "^1.2.0", + "gl-matrix-invert": "^1.0.0", "gl-mesh3d": "^2.3.1", "gl-plot2d": "^1.4.5", "gl-plot3d": "^2.4.6", @@ -100,7 +101,7 @@ "mouse-event-offset": "^3.0.2", "mouse-wheel": "^1.2.0", "ndarray": "^1.0.19", - "ndarray-homography": "^1.0.0", + "ndarray-linear-interpolate": "^1.0.0", "parse-svg-path": "^0.1.2", "point-cluster": "^3.1.8", "polybooljs": "^1.2.0", diff --git a/src/traces/surface/convert.js b/src/traces/surface/convert.js index a4c53da76f7..c02a96a381f 100644 --- a/src/traces/surface/convert.js +++ b/src/traces/surface/convert.js @@ -12,16 +12,17 @@ var createSurface = require('gl-surface3d'); var ndarray = require('ndarray'); -var homography = require('ndarray-homography'); +var invert = require('gl-matrix-invert'); +var ndarrayInterp2d = require('ndarray-linear-interpolate').d2; + +var interp2d = require('../heatmap/interp2d'); +var findEmpties = require('../heatmap/find_empties'); var isArrayOrTypedArray = require('../../lib').isArrayOrTypedArray; var parseColorScale = require('../../lib/gl_format_color').parseColorScale; var str2RgbaArray = require('../../lib/str2rgbarray'); var extractOpts = require('../../components/colorscale').extractOpts; -var interp2d = require('../heatmap/interp2d'); -var findEmpties = require('../heatmap/find_empties'); - function SurfaceTrace(scene, surface, uid) { this.scene = scene; this.uid = uid; @@ -319,6 +320,50 @@ proto.estimateScale = function(resSrc, axis) { return (scale > 1) ? scale : 1; }; +// based on Mikola Lysenko's ndarray-homography +// see https://github.com/scijs/ndarray-homography + +function fnHomography(out, inp, X) { + var n = 2; // we only use 2 dimensions here + var i, j; + for(i = 0; i < n; ++i) { + out[i] = X[(n + 1) * n + i]; + for(j = 0; j < n; ++j) { + out[i] += X[(n + 1) * j + i] * inp[j]; + } + } + var w = X[(n + 1) * (n + 1) - 1]; + for(j = 0; j < n; ++j) { + w += X[(n + 1) * j + n] * inp[j]; + } + var wr = 1 / w; + for(i = 0; i < n; ++i) { + out[i] *= wr; + } + return out; +} + +function homography(dest, src, X) { + warp(dest, src, fnHomography, X); + return dest; +} + +// based on Mikola Lysenko's ndarray-warp +// see https://github.com/scijs/ndarray-warp + +function warp(dest, src, func, X) { + var warped = [0, 0]; + var ni = dest.shape[0]; + var nj = dest.shape[1]; + for(var i = 0; i < ni; i++) { + for(var j = 0; j < nj; j++) { + func(warped, [i, j], X); + dest.set(i, j, ndarrayInterp2d(src, warped[0], warped[1])); + } + } + return dest; +} + proto.refineCoords = function(coords) { var scaleW = this.dataScaleX; var scaleH = this.dataScaleY; @@ -333,18 +378,17 @@ proto.refineCoords = function(coords) { var padWidth = 1 + width + 1; var padHeight = 1 + height + 1; var padImg = ndarray(new Float32Array(padWidth * padHeight), [padWidth, padHeight]); + var X = invert([], [ + scaleW, 0, 0, + 0, scaleH, 0, + 0, 0, 1 + ]); for(var i = 0; i < coords.length; ++i) { this.surface.padField(padImg, coords[i]); var scaledImg = ndarray(new Float32Array(newWidth * newHeight), [newWidth, newHeight]); - homography(scaledImg, padImg, - [ - scaleW, 0, 0, - 0, scaleH, 0, - 0, 0, 1 - ] - ); + homography(scaledImg, padImg, X); coords[i] = scaledImg; } }; From db6f9e7efe643bdab2df3fc168296e5c71158b1b Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 18 Jun 2020 17:38:31 -0400 Subject: [PATCH 2/2] more optimization for invert and 2d case --- package-lock.json | 15 --------------- package.json | 1 - src/traces/surface/convert.js | 28 +++++++--------------------- 3 files changed, 7 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb69e755fcc..8265009df65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4630,11 +4630,6 @@ "ndarray": "^1.0.18" } }, - "gl-mat2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gl-mat2/-/gl-mat2-1.0.1.tgz", - "integrity": "sha1-FCUFcwpcL+Hp8l2ezj0NbMJxCjA=" - }, "gl-mat3": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gl-mat3/-/gl-mat3-1.0.0.tgz", @@ -4650,16 +4645,6 @@ "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz", "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" }, - "gl-matrix-invert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gl-matrix-invert/-/gl-matrix-invert-1.0.0.tgz", - "integrity": "sha1-o2173jZUxFkKEn7nxo9uE/6oxj0=", - "requires": { - "gl-mat2": "^1.0.0", - "gl-mat3": "^1.0.0", - "gl-mat4": "^1.0.0" - } - }, "gl-mesh3d": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/gl-mesh3d/-/gl-mesh3d-2.3.1.tgz", diff --git a/package.json b/package.json index 2a18e515a97..93c64dccaa7 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,6 @@ "gl-heatmap2d": "^1.0.6", "gl-line3d": "1.2.1", "gl-mat4": "^1.2.0", - "gl-matrix-invert": "^1.0.0", "gl-mesh3d": "^2.3.1", "gl-plot2d": "^1.4.5", "gl-plot3d": "^2.4.6", diff --git a/src/traces/surface/convert.js b/src/traces/surface/convert.js index c02a96a381f..06bb723eb58 100644 --- a/src/traces/surface/convert.js +++ b/src/traces/surface/convert.js @@ -12,7 +12,6 @@ var createSurface = require('gl-surface3d'); var ndarray = require('ndarray'); -var invert = require('gl-matrix-invert'); var ndarrayInterp2d = require('ndarray-linear-interpolate').d2; var interp2d = require('../heatmap/interp2d'); @@ -324,22 +323,9 @@ proto.estimateScale = function(resSrc, axis) { // see https://github.com/scijs/ndarray-homography function fnHomography(out, inp, X) { - var n = 2; // we only use 2 dimensions here - var i, j; - for(i = 0; i < n; ++i) { - out[i] = X[(n + 1) * n + i]; - for(j = 0; j < n; ++j) { - out[i] += X[(n + 1) * j + i] * inp[j]; - } - } - var w = X[(n + 1) * (n + 1) - 1]; - for(j = 0; j < n; ++j) { - w += X[(n + 1) * j + n] * inp[j]; - } - var wr = 1 / w; - for(i = 0; i < n; ++i) { - out[i] *= wr; - } + var w = X[8] + X[2] * inp[0] + X[5] * inp[1]; + out[0] = (X[6] + X[0] * inp[0] + X[3] * inp[1]) / w; + out[1] = (X[7] + X[1] * inp[0] + X[4] * inp[1]) / w; return out; } @@ -378,11 +364,11 @@ proto.refineCoords = function(coords) { var padWidth = 1 + width + 1; var padHeight = 1 + height + 1; var padImg = ndarray(new Float32Array(padWidth * padHeight), [padWidth, padHeight]); - var X = invert([], [ - scaleW, 0, 0, - 0, scaleH, 0, + var X = [ + 1 / scaleW, 0, 0, + 0, 1 / scaleH, 0, 0, 0, 1 - ]); + ]; for(var i = 0; i < coords.length; ++i) { this.surface.padField(padImg, coords[i]);