11
11
var Lib = require ( '../../lib' ) ;
12
12
var constants = require ( './constants' ) ;
13
13
14
- module . exports = function findAllPaths ( pathinfo ) {
14
+ module . exports = function findAllPaths ( pathinfo , xtol , ytol ) {
15
15
var cnt ,
16
16
startLoc ,
17
17
i ,
18
18
pi ,
19
19
j ;
20
20
21
+ // Default just passes these values through as they were before:
22
+ xtol = xtol || 0.01 ;
23
+ ytol = ytol || 0.01 ;
24
+
21
25
for ( i = 0 ; i < pathinfo . length ; i ++ ) {
22
26
pi = pathinfo [ i ] ;
23
27
24
28
for ( j = 0 ; j < pi . starts . length ; j ++ ) {
25
29
startLoc = pi . starts [ j ] ;
26
- makePath ( pi , startLoc , 'edge' ) ;
30
+ makePath ( pi , startLoc , 'edge' , xtol , ytol ) ;
27
31
}
28
32
29
33
cnt = 0 ;
30
34
while ( Object . keys ( pi . crossings ) . length && cnt < 10000 ) {
31
35
cnt ++ ;
32
36
startLoc = Object . keys ( pi . crossings ) [ 0 ] . split ( ',' ) . map ( Number ) ;
33
- makePath ( pi , startLoc ) ;
37
+ makePath ( pi , startLoc , undefined , xtol , ytol ) ;
34
38
}
35
39
if ( cnt === 10000 ) Lib . log ( 'Infinite loop in contour?' ) ;
36
40
}
37
41
} ;
38
42
39
- function equalPts ( pt1 , pt2 ) {
40
- return Math . abs ( pt1 [ 0 ] - pt2 [ 0 ] ) < 0.01 &&
41
- Math . abs ( pt1 [ 1 ] - pt2 [ 1 ] ) < 0.01 ;
43
+ function equalPts ( pt1 , pt2 , xtol , ytol ) {
44
+ return Math . abs ( pt1 [ 0 ] - pt2 [ 0 ] ) < xtol &&
45
+ Math . abs ( pt1 [ 1 ] - pt2 [ 1 ] ) < ytol ;
42
46
}
43
47
44
48
function ptDist ( pt1 , pt2 ) {
@@ -47,17 +51,17 @@ function ptDist(pt1, pt2) {
47
51
return Math . sqrt ( dx * dx + dy * dy ) ;
48
52
}
49
53
50
- function makePath ( pi , loc , edgeflag ) {
51
- var startLocStr = loc . join ( ',' ) ,
52
- locStr = startLocStr ,
53
- mi = pi . crossings [ locStr ] ,
54
- marchStep = startStep ( mi , edgeflag , loc ) ,
55
- // start by going backward a half step and finding the crossing point
56
- pts = [ getInterpPx ( pi , loc , [ - marchStep [ 0 ] , - marchStep [ 1 ] ] ) ] ,
57
- startStepStr = marchStep . join ( ',' ) ,
58
- m = pi . z . length ,
59
- n = pi . z [ 0 ] . length ,
60
- cnt ;
54
+ function makePath ( pi , loc , edgeflag , xtol , ytol ) {
55
+ var startLocStr = loc . join ( ',' ) ;
56
+ var locStr = startLocStr ;
57
+ var mi = pi . crossings [ locStr ] ;
58
+ var marchStep = startStep ( mi , edgeflag , loc ) ;
59
+ // start by going backward a half step and finding the crossing point
60
+ var pts = [ getInterpPx ( pi , loc , [ - marchStep [ 0 ] , - marchStep [ 1 ] ] ) ] ;
61
+ var startStepStr = marchStep . join ( ',' ) ;
62
+ var m = pi . z . length ;
63
+ var n = pi . z [ 0 ] . length ;
64
+ var cnt ;
61
65
62
66
// now follow the path
63
67
for ( cnt = 0 ; cnt < 10000 ; cnt ++ ) { // just to avoid infinite loops
@@ -81,7 +85,7 @@ function makePath(pi, loc, edgeflag) {
81
85
loc [ 1 ] += marchStep [ 1 ] ;
82
86
83
87
// don't include the same point multiple times
84
- if ( equalPts ( pts [ pts . length - 1 ] , pts [ pts . length - 2 ] ) ) pts . pop ( ) ;
88
+ if ( equalPts ( pts [ pts . length - 1 ] , pts [ pts . length - 2 ] , xtol , ytol ) ) pts . pop ( ) ;
85
89
locStr = loc . join ( ',' ) ;
86
90
87
91
var atEdge = ( marchStep [ 0 ] && ( loc [ 0 ] < 0 || loc [ 0 ] > n - 2 ) ) ||
@@ -97,7 +101,7 @@ function makePath(pi, loc, edgeflag) {
97
101
if ( cnt === 10000 ) {
98
102
Lib . log ( 'Infinite loop in contour?' ) ;
99
103
}
100
- var closedpath = equalPts ( pts [ 0 ] , pts [ pts . length - 1 ] ) ,
104
+ var closedpath = equalPts ( pts [ 0 ] , pts [ pts . length - 1 ] , xtol , ytol ) ,
101
105
totaldist = 0 ,
102
106
distThresholdFactor = 0.2 * pi . smoothing ,
103
107
alldists = [ ] ,
@@ -186,15 +190,15 @@ function makePath(pi, loc, edgeflag) {
186
190
// edge path - does it start where an existing edge path ends, or vice versa?
187
191
var merged = false ;
188
192
pi . edgepaths . forEach ( function ( edgepath , edgei ) {
189
- if ( ! merged && equalPts ( edgepath [ 0 ] , pts [ pts . length - 1 ] ) ) {
193
+ if ( ! merged && equalPts ( edgepath [ 0 ] , pts [ pts . length - 1 ] , xtol , ytol ) ) {
190
194
pts . pop ( ) ;
191
195
merged = true ;
192
196
193
197
// now does it ALSO meet the end of another (or the same) path?
194
198
var doublemerged = false ;
195
199
pi . edgepaths . forEach ( function ( edgepath2 , edgei2 ) {
196
200
if ( ! doublemerged && equalPts (
197
- edgepath2 [ edgepath2 . length - 1 ] , pts [ 0 ] ) ) {
201
+ edgepath2 [ edgepath2 . length - 1 ] , pts [ 0 ] , xtol , ytol ) ) {
198
202
doublemerged = true ;
199
203
pts . splice ( 0 , 1 ) ;
200
204
pi . edgepaths . splice ( edgei , 1 ) ;
@@ -214,7 +218,7 @@ function makePath(pi, loc, edgeflag) {
214
218
}
215
219
} ) ;
216
220
pi . edgepaths . forEach ( function ( edgepath , edgei ) {
217
- if ( ! merged && equalPts ( edgepath [ edgepath . length - 1 ] , pts [ 0 ] ) ) {
221
+ if ( ! merged && equalPts ( edgepath [ edgepath . length - 1 ] , pts [ 0 ] , xtol , ytol ) ) {
218
222
pts . splice ( 0 , 1 ) ;
219
223
pi . edgepaths [ edgei ] = edgepath . concat ( pts ) ;
220
224
merged = true ;
@@ -257,6 +261,7 @@ function getInterpPx(pi, loc, step) {
257
261
258
262
if ( step [ 1 ] ) {
259
263
var dx = ( pi . level - zxy ) / ( pi . z [ locy ] [ locx + 1 ] - zxy ) ;
264
+
260
265
return [ xa . c2p ( ( 1 - dx ) * pi . x [ locx ] + dx * pi . x [ locx + 1 ] , true ) ,
261
266
ya . c2p ( pi . y [ locy ] , true ) ] ;
262
267
}
0 commit comments