12
12
var createSurface = require ( 'gl-surface3d' ) ;
13
13
14
14
var ndarray = require ( 'ndarray' ) ;
15
- var homography = require ( 'ndarray-homography' ) ;
15
+ var invert = require ( 'gl-matrix-invert' ) ;
16
+ var ndarrayInterp2d = require ( 'ndarray-linear-interpolate' ) . d2 ;
17
+
18
+ var interp2d = require ( '../heatmap/interp2d' ) ;
19
+ var findEmpties = require ( '../heatmap/find_empties' ) ;
16
20
17
21
var isArrayOrTypedArray = require ( '../../lib' ) . isArrayOrTypedArray ;
18
22
var parseColorScale = require ( '../../lib/gl_format_color' ) . parseColorScale ;
19
23
var str2RgbaArray = require ( '../../lib/str2rgbarray' ) ;
20
24
var extractOpts = require ( '../../components/colorscale' ) . extractOpts ;
21
25
22
- var interp2d = require ( '../heatmap/interp2d' ) ;
23
- var findEmpties = require ( '../heatmap/find_empties' ) ;
24
-
25
26
function SurfaceTrace ( scene , surface , uid ) {
26
27
this . scene = scene ;
27
28
this . uid = uid ;
@@ -319,6 +320,50 @@ proto.estimateScale = function(resSrc, axis) {
319
320
return ( scale > 1 ) ? scale : 1 ;
320
321
} ;
321
322
323
+ // based on Mikola Lysenko's ndarray-homography
324
+ // see https://github.com/scijs/ndarray-homography
325
+
326
+ function fnHomography ( out , inp , X ) {
327
+ var n = 2 ; // we only use 2 dimensions here
328
+ var i , j ;
329
+ for ( i = 0 ; i < n ; ++ i ) {
330
+ out [ i ] = X [ ( n + 1 ) * n + i ] ;
331
+ for ( j = 0 ; j < n ; ++ j ) {
332
+ out [ i ] += X [ ( n + 1 ) * j + i ] * inp [ j ] ;
333
+ }
334
+ }
335
+ var w = X [ ( n + 1 ) * ( n + 1 ) - 1 ] ;
336
+ for ( j = 0 ; j < n ; ++ j ) {
337
+ w += X [ ( n + 1 ) * j + n ] * inp [ j ] ;
338
+ }
339
+ var wr = 1 / w ;
340
+ for ( i = 0 ; i < n ; ++ i ) {
341
+ out [ i ] *= wr ;
342
+ }
343
+ return out ;
344
+ }
345
+
346
+ function homography ( dest , src , X ) {
347
+ warp ( dest , src , fnHomography , X ) ;
348
+ return dest ;
349
+ }
350
+
351
+ // based on Mikola Lysenko's ndarray-warp
352
+ // see https://github.com/scijs/ndarray-warp
353
+
354
+ function warp ( dest , src , func , X ) {
355
+ var warped = [ 0 , 0 ] ;
356
+ var ni = dest . shape [ 0 ] ;
357
+ var nj = dest . shape [ 1 ] ;
358
+ for ( var i = 0 ; i < ni ; i ++ ) {
359
+ for ( var j = 0 ; j < nj ; j ++ ) {
360
+ func ( warped , [ i , j ] , X ) ;
361
+ dest . set ( i , j , ndarrayInterp2d ( src , warped [ 0 ] , warped [ 1 ] ) ) ;
362
+ }
363
+ }
364
+ return dest ;
365
+ }
366
+
322
367
proto . refineCoords = function ( coords ) {
323
368
var scaleW = this . dataScaleX ;
324
369
var scaleH = this . dataScaleY ;
@@ -333,18 +378,17 @@ proto.refineCoords = function(coords) {
333
378
var padWidth = 1 + width + 1 ;
334
379
var padHeight = 1 + height + 1 ;
335
380
var padImg = ndarray ( new Float32Array ( padWidth * padHeight ) , [ padWidth , padHeight ] ) ;
381
+ var X = invert ( [ ] , [
382
+ scaleW , 0 , 0 ,
383
+ 0 , scaleH , 0 ,
384
+ 0 , 0 , 1
385
+ ] ) ;
336
386
337
387
for ( var i = 0 ; i < coords . length ; ++ i ) {
338
388
this . surface . padField ( padImg , coords [ i ] ) ;
339
389
340
390
var scaledImg = ndarray ( new Float32Array ( newWidth * newHeight ) , [ newWidth , newHeight ] ) ;
341
- homography ( scaledImg , padImg ,
342
- [
343
- scaleW , 0 , 0 ,
344
- 0 , scaleH , 0 ,
345
- 0 , 0 , 1
346
- ]
347
- ) ;
391
+ homography ( scaledImg , padImg , X ) ;
348
392
coords [ i ] = scaledImg ;
349
393
}
350
394
} ;
0 commit comments