/ src / _impl / _contours_impl.scad
_contours_impl.scad
   1  use <../util/lerp.scad>
   2  
   3  function interpolated_pt(p0, p1, threshold) = 
   4     let(p = lerp(p0, p1, (threshold - p0.z) / (p1.z - p0.z)))
   5     [p.x, p.y, p.z];
   6  
   7  /*
   8      Grid indexes
   9      1 - 2
  10      |    |
  11      0 - 3
  12  */
  13  
  14  /*
  15      ISOLINES Impl Begin ============================
  16  */
  17  
  18  function _isolines_pn_label(pts, threshold) =
  19      [
  20          for(row = pts)
  21          [for(p = row) [each p, p.z >= threshold]]
  22      ]; 
  23      
  24  function _isolines_corner_value(cell_pts) =
  25      let(
  26          c0 = cell_pts[0][3] ? 1 : 0,
  27          c1 = cell_pts[1][3] ? 2 : 0,
  28          c2 = cell_pts[2][3] ? 4 : 0,
  29          c3 = cell_pts[3][3] ? 8 : 0
  30      )
  31      c0 + c1 + c2 + c3;
  32  
  33  function _case1_isolines(cell_pts, threshold) = [
  34      [interpolated_pt(cell_pts[0], cell_pts[1], threshold), interpolated_pt(cell_pts[0], cell_pts[3], threshold)]
  35  ];
  36  
  37  function _case2_isolines(cell_pts, threshold) = [
  38      [interpolated_pt(cell_pts[0], cell_pts[3], threshold), interpolated_pt(cell_pts[2], cell_pts[3], threshold)]
  39  ];
  40  
  41  function _case3_isolines(cell_pts, threshold) = [
  42      [interpolated_pt(cell_pts[0], cell_pts[1], threshold), interpolated_pt(cell_pts[2], cell_pts[3], threshold)]
  43  ];
  44  
  45  function _case4_isolines(cell_pts, threshold) = [
  46      [interpolated_pt(cell_pts[1], cell_pts[2], threshold), interpolated_pt(cell_pts[2], cell_pts[3], threshold)]
  47  ];
  48  
  49  function _case5_isolines(cell_pts, threshold) = 
  50      let(center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4)
  51      center_p[2] >= threshold ?
  52      [
  53          [interpolated_pt(cell_pts[0], cell_pts[1], threshold), interpolated_pt(cell_pts[1], center_p, threshold), interpolated_pt(cell_pts[1], cell_pts[2], threshold)],
  54          [interpolated_pt(cell_pts[0], cell_pts[3], threshold), interpolated_pt(cell_pts[3], center_p, threshold), interpolated_pt(cell_pts[2], cell_pts[3], threshold)]
  55      ]
  56      :
  57      [
  58          [interpolated_pt(cell_pts[0], cell_pts[1], threshold), interpolated_pt(cell_pts[0], center_p, threshold), interpolated_pt(cell_pts[0], cell_pts[3], threshold)],
  59          [interpolated_pt(cell_pts[1], cell_pts[2], threshold), interpolated_pt(cell_pts[2], center_p, threshold), interpolated_pt(cell_pts[2], cell_pts[3], threshold)]
  60      ];
  61  
  62  function _case6_isolines(cell_pts, threshold) = [
  63      [interpolated_pt(cell_pts[1], cell_pts[2], threshold), interpolated_pt(cell_pts[0], cell_pts[3], threshold)]
  64  ];
  65  
  66  function _case7_isolines(cell_pts, threshold) = [
  67      [interpolated_pt(cell_pts[0], cell_pts[1], threshold), interpolated_pt(cell_pts[1], cell_pts[2], threshold)]
  68  ];
  69      
  70  function _case8_isolines(cell_pts, threshold) = _case7_isolines(cell_pts, threshold);
  71  
  72  function _case9_isolines(cell_pts, threshold) = _case6_isolines(cell_pts, threshold);
  73  
  74  function _case10_isolines(cell_pts, threshold) = 
  75      let(center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4)
  76      center_p[2] >= threshold ?
  77          [
  78              [interpolated_pt(cell_pts[0], cell_pts[1], threshold), interpolated_pt(cell_pts[1], center_p, threshold), interpolated_pt(cell_pts[0], cell_pts[3], threshold)],
  79              [interpolated_pt(cell_pts[1], cell_pts[2], threshold), interpolated_pt(cell_pts[2], center_p, threshold), interpolated_pt(cell_pts[2], cell_pts[3], threshold)]
  80          ]
  81          :
  82          [
  83              [interpolated_pt(cell_pts[0], cell_pts[1], threshold), interpolated_pt(cell_pts[1], center_p, threshold), interpolated_pt(cell_pts[1], cell_pts[2], threshold)],
  84              [interpolated_pt(cell_pts[0], cell_pts[3], threshold), interpolated_pt(cell_pts[3], center_p, threshold), interpolated_pt(cell_pts[2], cell_pts[3], threshold)]
  85          ];
  86      
  87  function _case11_isolines(cell_pts, threshold) = _case4_isolines(cell_pts, threshold);
  88  
  89  function _case12_isolines(cell_pts, threshold) = _case3_isolines(cell_pts, threshold);
  90  
  91  function _case13_isolines(cell_pts, threshold) = _case2_isolines(cell_pts, threshold);
  92  
  93  function _case14_isolines(cell_pts, threshold) = _case1_isolines(cell_pts, threshold);
  94  
  95  function _isolines_of(cell_pts, threshold) =
  96      let(cv = _isolines_corner_value(cell_pts))
  97      cv == 0 || cv == 15  ? [] :
  98      cv == 1  ? _case1_isolines(cell_pts, threshold) :
  99      cv == 8  ? _case2_isolines(cell_pts, threshold) :
 100      cv == 9  ? _case3_isolines(cell_pts, threshold) :
 101      cv == 4  ? _case4_isolines(cell_pts, threshold) :
 102      cv == 5  ? _case5_isolines(cell_pts, threshold) :
 103      cv == 12 ? _case6_isolines(cell_pts, threshold) :
 104      cv == 13 ? _case7_isolines(cell_pts, threshold) :
 105      cv == 2  ? _case8_isolines(cell_pts, threshold) :
 106      cv == 3  ? _case9_isolines(cell_pts, threshold) :
 107      cv == 10 ? _case10_isolines(cell_pts, threshold) :
 108      cv == 11 ? _case11_isolines(cell_pts, threshold) :
 109      cv == 6  ? _case12_isolines(cell_pts, threshold) :
 110      cv == 7  ? _case13_isolines(cell_pts, threshold) :
 111                 _case14_isolines(cell_pts, threshold);
 112  
 113  function _marching_squares_isolines(points, threshold) = 
 114      let(labeled_pts = _isolines_pn_label(points, threshold))
 115      [
 116          for(y = [0:len(labeled_pts) - 2])            
 117              let(
 118                  labeled_pts_y = labeled_pts[y],
 119                  labeled_pts_y_1 = labeled_pts[y + 1]
 120              )
 121              for(x = [0:len(labeled_pts[0]) - 2])
 122              each _isolines_of(
 123                  [
 124                      labeled_pts_y[x],
 125                      labeled_pts_y_1[x],
 126                      labeled_pts_y_1[x + 1],
 127                      labeled_pts_y[x + 1]
 128                  ], 
 129                  threshold
 130              )
 131      ];               
 132  
 133  /*
 134      ISOLINES Impl End ============================
 135  */
 136  
 137  /*
 138      ISOBANDS Impl Begin ============================
 139  */
 140  
 141  function _isobands_tri_label(pts, lower, upper) =
 142      [
 143          for(row = pts)
 144          [
 145              for(p = row) 
 146              let(
 147                  label = p.z < lower ? 0 : 
 148                          p.z > upper ? 2 : 1
 149              )
 150              [each p, label]
 151          ]
 152      ]; 
 153      
 154  function _isobands_corner_value(cell_pts) =
 155      str(cell_pts[1][3], cell_pts[2][3], cell_pts[3][3], cell_pts[0][3]); 
 156  
 157  // single triangle
 158  function _case2221_isobands(cell_pts, threshold) = [
 159      [
 160          [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
 161          interpolated_pt(cell_pts[0], cell_pts[3], threshold),
 162          interpolated_pt(cell_pts[0], cell_pts[1], threshold)
 163      ]
 164  ];
 165  
 166  function _case2212_isobands(cell_pts, threshold) = [
 167      [
 168          interpolated_pt(cell_pts[0], cell_pts[3], threshold),
 169          [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
 170          interpolated_pt(cell_pts[2], cell_pts[3], threshold)
 171      ]
 172  ];
 173  
 174  function _case2122_isobands(cell_pts, threshold) = [
 175      [
 176          interpolated_pt(cell_pts[1], cell_pts[2], threshold),
 177          interpolated_pt(cell_pts[2], cell_pts[3], threshold),
 178          [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z]
 179      ]
 180  ];
 181      
 182  function _case1222_isobands(cell_pts, threshold) = [
 183      [
 184          interpolated_pt(cell_pts[0], cell_pts[1], threshold),
 185          interpolated_pt(cell_pts[1], cell_pts[2], threshold),
 186          [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z]
 187      ]
 188  ];
 189  
 190  function _case0001_isobands(cell_pts, threshold) = 
 191      _case2221_isobands(cell_pts, threshold);
 192      
 193  function _case0010_isobands(cell_pts, threshold) = 
 194      _case2212_isobands(cell_pts, threshold);
 195      
 196  function _case0100_isobands(cell_pts, threshold) = 
 197      _case2122_isobands(cell_pts, threshold);
 198  
 199  function _case1000_isobands(cell_pts, threshold) = 
 200      _case1222_isobands(cell_pts, threshold);
 201      
 202   // single trapezoid
 203  function _case2220_isobands(cell_pts, lower, upper) = [
 204      [
 205          interpolated_pt(cell_pts[0], cell_pts[1], lower),
 206          interpolated_pt(cell_pts[0], cell_pts[3], lower),
 207          interpolated_pt(cell_pts[0], cell_pts[3], upper),
 208          interpolated_pt(cell_pts[0], cell_pts[1], upper)
 209      ]
 210  ];
 211  
 212  function _case2202_isobands(cell_pts, lower, upper) = [
 213      [
 214          interpolated_pt(cell_pts[0], cell_pts[3], upper),
 215          interpolated_pt(cell_pts[0], cell_pts[3], lower),
 216          interpolated_pt(cell_pts[2], cell_pts[3], lower),
 217          interpolated_pt(cell_pts[2], cell_pts[3], upper)
 218      ]
 219  ];
 220  
 221  function _case2022_isobands(cell_pts, lower, upper) = [
 222      [
 223          interpolated_pt(cell_pts[1], cell_pts[2], upper),
 224          interpolated_pt(cell_pts[2], cell_pts[3], upper),
 225          interpolated_pt(cell_pts[2], cell_pts[3], lower),
 226          interpolated_pt(cell_pts[1], cell_pts[2], lower)
 227      ]
 228  ];
 229      
 230  function _case0222_isobands(cell_pts, lower, upper) = [
 231      [
 232          interpolated_pt(cell_pts[0], cell_pts[1], upper),
 233          interpolated_pt(cell_pts[1], cell_pts[2], upper),
 234          interpolated_pt(cell_pts[1], cell_pts[2], lower),
 235          interpolated_pt(cell_pts[0], cell_pts[1], lower)
 236      ]
 237  ];
 238      
 239  function _case0002_isobands(cell_pts, lower, upper) = 
 240      _case2220_isobands(cell_pts, upper, lower);
 241  
 242  function _case0020_isobands(cell_pts, lower, upper) = 
 243      _case2202_isobands(cell_pts, upper, lower);
 244      
 245  function _case0200_isobands(cell_pts, lower, upper) = 
 246      _case2022_isobands(cell_pts, upper, lower);
 247  
 248  function _case2000_isobands(cell_pts, lower, upper) = 
 249      _case0222_isobands(cell_pts, upper, lower);
 250      
 251  // single rectangle    
 252  function _case0011_isobands(cell_pts, threshold) = [
 253      [
 254          [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
 255          [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
 256          interpolated_pt(cell_pts[2], cell_pts[3], threshold),
 257          interpolated_pt(cell_pts[0], cell_pts[1], threshold)
 258      ]
 259  ];
 260      
 261  function _case0110_isobands(cell_pts, threshold) = [
 262      [
 263          interpolated_pt(cell_pts[0], cell_pts[3], threshold),
 264          [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
 265          [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 266          interpolated_pt(cell_pts[1], cell_pts[2], threshold)
 267      ]
 268  ];
 269  
 270  function _case1100_isobands(cell_pts, threshold) = [
 271      [
 272          interpolated_pt(cell_pts[0], cell_pts[1], threshold),
 273          interpolated_pt(cell_pts[2], cell_pts[3], threshold),
 274          [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 275          [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z]
 276      ]
 277  ];
 278  
 279  function _case1001_isobands(cell_pts, threshold) = [
 280      [
 281          [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
 282          interpolated_pt(cell_pts[0], cell_pts[3], threshold),
 283          interpolated_pt(cell_pts[1], cell_pts[2], threshold),
 284          [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z]
 285      ]
 286  ];
 287  
 288  function _case2211_isobands(cell_pts, threshold) = 
 289      _case0011_isobands(cell_pts, threshold);
 290      
 291  function _case2112_isobands(cell_pts, threshold) = 
 292      _case0110_isobands(cell_pts, threshold);    
 293  
 294  function _case1122_isobands(cell_pts, threshold) = 
 295      _case1100_isobands(cell_pts, threshold);        
 296  
 297  function _case1221_isobands(cell_pts, threshold) = 
 298      _case1001_isobands(cell_pts, threshold);   
 299          
 300  function _case2200_isobands(cell_pts, lower, upper) = [
 301      [
 302          interpolated_pt(cell_pts[0], cell_pts[1], lower),
 303          interpolated_pt(cell_pts[2], cell_pts[3], lower),
 304          interpolated_pt(cell_pts[2], cell_pts[3], upper),
 305          interpolated_pt(cell_pts[0], cell_pts[1], upper)
 306      ]
 307  ];
 308  
 309  function _case2002_isobands(cell_pts, lower, upper) = [
 310      [
 311          interpolated_pt(cell_pts[0], cell_pts[3], upper),
 312          interpolated_pt(cell_pts[0], cell_pts[3], lower),
 313          interpolated_pt(cell_pts[1], cell_pts[2], lower),
 314          interpolated_pt(cell_pts[1], cell_pts[2], upper)
 315      ]
 316  ];
 317          
 318  function _case0022_isobands(cell_pts, lower, upper) = 
 319      _case2200_isobands(cell_pts, upper, lower);
 320  
 321  function _case0220_isobands(cell_pts, lower, upper) = 
 322      _case2002_isobands(cell_pts, upper, lower);
 323  
 324  // single hexagon
 325  function _case0211_isobands(cell_pts, lower, upper) = [
 326      [
 327          [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
 328          [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
 329          interpolated_pt(cell_pts[2], cell_pts[3], upper),
 330          interpolated_pt(cell_pts[1], cell_pts[2], upper),
 331          interpolated_pt(cell_pts[1], cell_pts[2], lower),
 332          interpolated_pt(cell_pts[0], cell_pts[1], lower)
 333      ]
 334  ];
 335      
 336  function _case2110_isobands(cell_pts, lower, upper) = [
 337      [
 338          interpolated_pt(cell_pts[0], cell_pts[1], lower),
 339          interpolated_pt(cell_pts[0], cell_pts[3], lower),
 340          [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
 341          [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 342          interpolated_pt(cell_pts[1], cell_pts[2], upper),
 343          interpolated_pt(cell_pts[0], cell_pts[1], upper)
 344      ]
 345  ];
 346  
 347  function _case1102_isobands(cell_pts, lower, upper) = [
 348      [
 349          interpolated_pt(cell_pts[0], cell_pts[1], upper),
 350          interpolated_pt(cell_pts[0], cell_pts[3], upper),
 351          interpolated_pt(cell_pts[0], cell_pts[3], lower),
 352          interpolated_pt(cell_pts[2], cell_pts[3], lower),
 353          [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 354          [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z]
 355      ]
 356  ];
 357  
 358  function _case1021_isobands(cell_pts, lower, upper) = [
 359      [
 360          [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],    
 361          interpolated_pt(cell_pts[0], cell_pts[3], upper),
 362          interpolated_pt(cell_pts[2], cell_pts[3], upper),
 363          interpolated_pt(cell_pts[2], cell_pts[3], lower),
 364          interpolated_pt(cell_pts[1], cell_pts[2], lower),
 365          [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z]
 366      ]
 367  ];
 368      
 369  function _case2011_isobands(cell_pts, lower, upper) = 
 370      _case0211_isobands(cell_pts, upper, lower);    
 371  
 372  function _case0112_isobands(cell_pts, lower, upper) = 
 373      _case2110_isobands(cell_pts, upper, lower);    
 374      
 375  function _case1120_isobands(cell_pts, lower, upper) = 
 376      _case1102_isobands(cell_pts, upper, lower);    
 377      
 378  function _case1201_isobands(cell_pts, lower, upper) = 
 379      _case1021_isobands(cell_pts, upper, lower);    
 380      
 381  function _case2101_isobands(cell_pts, lower, upper) = [
 382      [
 383          [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],    
 384          interpolated_pt(cell_pts[0], cell_pts[3], lower),
 385          interpolated_pt(cell_pts[2], cell_pts[3], lower),
 386          [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 387          interpolated_pt(cell_pts[1], cell_pts[2], upper),
 388          interpolated_pt(cell_pts[0], cell_pts[1], upper)
 389      ]
 390  ];    
 391  
 392  function _case0121_isobands(cell_pts, lower, upper) = 
 393      _case2101_isobands(cell_pts, upper, lower);   
 394      
 395  function _case1012_isobands(cell_pts, lower, upper) = [
 396      [
 397          interpolated_pt(cell_pts[0], cell_pts[3], upper),
 398          [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],  
 399          interpolated_pt(cell_pts[2], cell_pts[3], lower),
 400          interpolated_pt(cell_pts[1], cell_pts[2], lower),
 401          [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z],  
 402          interpolated_pt(cell_pts[0], cell_pts[1], upper)
 403      ]
 404  ];        
 405      
 406  function _case1210_isobands(cell_pts, lower, upper) = 
 407      _case1012_isobands(cell_pts, upper, lower);   
 408  
 409  // single pentagon
 410  function _case1211_isobands(cell_pts, threshold) = [
 411      [
 412          [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
 413          [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
 414          interpolated_pt(cell_pts[2], cell_pts[3], threshold),
 415          interpolated_pt(cell_pts[1], cell_pts[2], threshold),
 416          [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z]
 417      ]
 418  ];
 419  
 420  function _case2111_isobands(cell_pts, threshold) = [
 421      [
 422          [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
 423          [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
 424          [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],        
 425          interpolated_pt(cell_pts[1], cell_pts[2], threshold),
 426          interpolated_pt(cell_pts[0], cell_pts[1], threshold)
 427      ]
 428  ];
 429  
 430  function _case1112_isobands(cell_pts, threshold) = [
 431      [
 432          interpolated_pt(cell_pts[0], cell_pts[3], threshold),   
 433          [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
 434          [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 435          [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z],        
 436          interpolated_pt(cell_pts[0], cell_pts[1], threshold)
 437      ]
 438  ];   
 439  
 440  function _case1121_isobands(cell_pts, threshold) = [
 441      [
 442          [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],    
 443          interpolated_pt(cell_pts[0], cell_pts[3], threshold),   
 444          interpolated_pt(cell_pts[2], cell_pts[3], threshold), 
 445          [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 446          [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z]
 447      ]
 448  ];   
 449      
 450  function _case1011_isobands(cell_pts, threshold) = 
 451      _case1211_isobands(cell_pts, threshold);  
 452  
 453  function _case0111_isobands(cell_pts, threshold) = 
 454      _case2111_isobands(cell_pts, threshold);   
 455  
 456  function _case1110_isobands(cell_pts, threshold) = 
 457      _case1112_isobands(cell_pts, threshold);   
 458  
 459  function _case1101_isobands(cell_pts, threshold) = 
 460      _case1121_isobands(cell_pts, threshold);       
 461  
 462  function _case1200_isobands(cell_pts, lower, upper) = [
 463      [
 464          interpolated_pt(cell_pts[0], cell_pts[1], lower),
 465          interpolated_pt(cell_pts[2], cell_pts[3], lower),
 466          interpolated_pt(cell_pts[2], cell_pts[3], upper),
 467          interpolated_pt(cell_pts[1], cell_pts[2], upper),
 468          [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z]
 469      ]
 470  ];     
 471  
 472  function _case0120_isobands(cell_pts, lower, upper) = [
 473      [
 474          interpolated_pt(cell_pts[0], cell_pts[3], lower),
 475          interpolated_pt(cell_pts[0], cell_pts[3], upper),
 476          interpolated_pt(cell_pts[2], cell_pts[3], upper),
 477          [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 478          interpolated_pt(cell_pts[1], cell_pts[2], lower)
 479      ]
 480  ];     
 481      
 482  function _case0012_isobands(cell_pts, lower, upper) = [
 483      [
 484          interpolated_pt(cell_pts[0], cell_pts[3], upper),
 485          [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
 486          interpolated_pt(cell_pts[2], cell_pts[3], lower),
 487          interpolated_pt(cell_pts[0], cell_pts[1], lower),
 488          interpolated_pt(cell_pts[0], cell_pts[1], upper)
 489      ]
 490  ];   
 491  
 492  function _case2001_isobands(cell_pts, lower, upper) = [
 493      [
 494          [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
 495          interpolated_pt(cell_pts[0], cell_pts[3], lower),
 496          interpolated_pt(cell_pts[1], cell_pts[2], lower),
 497          interpolated_pt(cell_pts[1], cell_pts[2], upper),
 498          interpolated_pt(cell_pts[0], cell_pts[1], upper)
 499      ]
 500  ];       
 501      
 502  function _case1022_isobands(cell_pts, lower, upper) = 
 503      _case1200_isobands(cell_pts, upper, lower);
 504  
 505  function _case2102_isobands(cell_pts, lower, upper) = 
 506      _case0120_isobands(cell_pts, upper, lower);
 507  
 508  function _case2210_isobands(cell_pts, lower, upper) = 
 509      _case0012_isobands(cell_pts, upper, lower);
 510  
 511  function _case0221_isobands(cell_pts, lower, upper) = 
 512      _case2001_isobands(cell_pts, upper, lower);    
 513      
 514  function _case1002_isobands(cell_pts, lower, upper) = [
 515      [
 516          interpolated_pt(cell_pts[0], cell_pts[3], upper),
 517          interpolated_pt(cell_pts[0], cell_pts[3], lower),
 518          interpolated_pt(cell_pts[1], cell_pts[2], lower),
 519          [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z],
 520          interpolated_pt(cell_pts[0], cell_pts[1], upper)
 521      ]
 522  ];   
 523  
 524  function _case2100_isobands(cell_pts, lower, upper) = [
 525      [
 526          interpolated_pt(cell_pts[0], cell_pts[1], lower),
 527          interpolated_pt(cell_pts[2], cell_pts[3], lower),
 528          [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 529          interpolated_pt(cell_pts[1], cell_pts[2], upper),
 530          interpolated_pt(cell_pts[0], cell_pts[1], upper)
 531      ]
 532  ]; 
 533      
 534  function _case0210_isobands(cell_pts, lower, upper) = [
 535      [
 536          interpolated_pt(cell_pts[0], cell_pts[3], lower),
 537          [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z], 
 538          interpolated_pt(cell_pts[2], cell_pts[3], upper),
 539          interpolated_pt(cell_pts[1], cell_pts[2], upper),
 540          interpolated_pt(cell_pts[1], cell_pts[2], lower)
 541      ]
 542  ]; 
 543  
 544  function _case0021_isobands(cell_pts, lower, upper) = [
 545      [
 546          [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z], 
 547          interpolated_pt(cell_pts[0], cell_pts[3], upper),
 548          interpolated_pt(cell_pts[2], cell_pts[3], upper),
 549          interpolated_pt(cell_pts[2], cell_pts[3], lower), 
 550          interpolated_pt(cell_pts[0], cell_pts[1], lower)
 551      ]
 552  ]; 
 553      
 554  function _case1220_isobands(cell_pts, lower, upper) = 
 555      _case1002_isobands(cell_pts, upper, lower);
 556  
 557  function _case0122_isobands(cell_pts, lower, upper) = 
 558      _case2100_isobands(cell_pts, upper, lower);
 559  
 560  function _case2012_isobands(cell_pts, lower, upper) = 
 561      _case0210_isobands(cell_pts, upper, lower);
 562  
 563  function _case2201_isobands(cell_pts, lower, upper) = 
 564      _case0021_isobands(cell_pts, upper, lower);        
 565      
 566  // Saddles
 567  function _case2020_isobands(cell_pts, lower, upper) = 
 568      let(
 569          center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4,
 570          center_p_z = center_p[2]
 571      )
 572      center_p_z < lower ? [
 573          [
 574              interpolated_pt(cell_pts[0], cell_pts[1], lower),
 575              interpolated_pt(cell_pts[1], center_p, lower),
 576              interpolated_pt(cell_pts[1], cell_pts[2], lower),
 577              interpolated_pt(cell_pts[1], cell_pts[2], upper), 
 578              interpolated_pt(cell_pts[1], center_p, upper),
 579              interpolated_pt(cell_pts[0], cell_pts[1], upper)
 580          ],
 581          [
 582              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 583              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 584              interpolated_pt(cell_pts[1], center_p, upper),
 585              interpolated_pt(cell_pts[2], cell_pts[3], upper), 
 586              interpolated_pt(cell_pts[2], cell_pts[3], lower),
 587              interpolated_pt(cell_pts[3], center_p, lower)
 588          ]
 589      ] :
 590      center_p_z >= lower && center_p_z <= upper ? [
 591          [
 592              interpolated_pt(cell_pts[0], cell_pts[1], lower),
 593              interpolated_pt(cell_pts[0], center_p, lower),
 594              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 595              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 596              interpolated_pt(cell_pts[3], center_p, upper),
 597              interpolated_pt(cell_pts[2], cell_pts[3], upper),
 598              interpolated_pt(cell_pts[2], cell_pts[3], lower),
 599              interpolated_pt(cell_pts[2], center_p, lower),
 600              interpolated_pt(cell_pts[1], cell_pts[2], lower),
 601              interpolated_pt(cell_pts[1], cell_pts[2], upper),
 602              interpolated_pt(cell_pts[1], center_p, upper),
 603              interpolated_pt(cell_pts[0], cell_pts[1], upper)
 604          ]
 605      ] : [
 606          [
 607              interpolated_pt(cell_pts[0], cell_pts[1], lower),
 608              interpolated_pt(cell_pts[0], center_p, lower),
 609              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 610              interpolated_pt(cell_pts[0], cell_pts[3], upper), 
 611              interpolated_pt(cell_pts[0], center_p, upper),
 612              interpolated_pt(cell_pts[0], cell_pts[1], upper)
 613          ],
 614          [
 615              interpolated_pt(cell_pts[1], cell_pts[2], upper),
 616              interpolated_pt(cell_pts[2], center_p, upper),
 617              interpolated_pt(cell_pts[2], cell_pts[3], upper),
 618              interpolated_pt(cell_pts[2], cell_pts[3], lower), 
 619              interpolated_pt(cell_pts[2], center_p, lower),
 620              interpolated_pt(cell_pts[1], cell_pts[2], lower)
 621          ]        
 622      ];
 623      
 624  function _case0202_isobands(cell_pts, lower, upper) = 
 625      let(
 626          center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4,
 627          center_p_z = center_p[2]
 628      )
 629      center_p_z < lower ? [
 630          [
 631              interpolated_pt(cell_pts[0], cell_pts[1], upper),
 632              interpolated_pt(cell_pts[0], center_p, upper),
 633              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 634              interpolated_pt(cell_pts[0], cell_pts[3], lower), 
 635              interpolated_pt(cell_pts[0], center_p, lower),
 636              interpolated_pt(cell_pts[0], cell_pts[1], lower)
 637          ],
 638          [
 639              interpolated_pt(cell_pts[1], cell_pts[2], lower),
 640              interpolated_pt(cell_pts[2], center_p, upper),
 641              interpolated_pt(cell_pts[2], cell_pts[3], lower),
 642              interpolated_pt(cell_pts[2], cell_pts[3], upper), 
 643              interpolated_pt(cell_pts[2], center_p, lower),
 644              interpolated_pt(cell_pts[1], cell_pts[2], upper)
 645          ]        
 646      ] :
 647      center_p_z >= lower && center_p_z <= upper ? [
 648          [
 649              interpolated_pt(cell_pts[0], cell_pts[1], upper),
 650              interpolated_pt(cell_pts[0], center_p, upper),
 651              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 652              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 653              interpolated_pt(cell_pts[3], center_p, lower),
 654              interpolated_pt(cell_pts[2], cell_pts[3], lower),
 655              interpolated_pt(cell_pts[2], cell_pts[3], upper),
 656              interpolated_pt(cell_pts[2], center_p, upper),
 657              interpolated_pt(cell_pts[1], cell_pts[2], upper),
 658              interpolated_pt(cell_pts[1], cell_pts[2], lower),
 659              interpolated_pt(cell_pts[1], center_p, lower),
 660              interpolated_pt(cell_pts[0], cell_pts[1], lower)
 661          ]
 662      ] : [
 663          [
 664              interpolated_pt(cell_pts[0], cell_pts[1], upper),
 665              interpolated_pt(cell_pts[1], center_p, upper),
 666              interpolated_pt(cell_pts[1], cell_pts[2], upper),
 667              interpolated_pt(cell_pts[1], cell_pts[2], lower), 
 668              interpolated_pt(cell_pts[1], center_p, lower),
 669              interpolated_pt(cell_pts[0], cell_pts[1], lower)
 670          ],
 671          [
 672              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 673              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 674              interpolated_pt(cell_pts[3], center_p, lower),
 675              interpolated_pt(cell_pts[2], cell_pts[3], lower), 
 676              interpolated_pt(cell_pts[2], cell_pts[3], upper),
 677              interpolated_pt(cell_pts[3], center_p, upper)
 678          ]
 679      ];
 680  
 681  function _case0101_isobands(cell_pts, lower, upper) = 
 682      let(
 683          center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4,
 684          center_p_z = center_p[2]
 685      )
 686      center_p_z < lower ? [
 687          [
 688              [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
 689              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 690              interpolated_pt(cell_pts[0], center_p, lower),
 691              interpolated_pt(cell_pts[0], cell_pts[1], lower)
 692          ],
 693          [
 694              interpolated_pt(cell_pts[2], center_p, lower),
 695              interpolated_pt(cell_pts[2], cell_pts[3], lower),
 696              [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 697              interpolated_pt(cell_pts[1], cell_pts[2], lower)
 698          ]        
 699      ] :
 700      center_p_z >= lower && center_p_z <= upper ? [
 701          [
 702              [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
 703              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 704              interpolated_pt(cell_pts[3], center_p, lower),
 705              interpolated_pt(cell_pts[2], cell_pts[3], lower),
 706              [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 707              interpolated_pt(cell_pts[1], cell_pts[2], lower),
 708              interpolated_pt(cell_pts[1], center_p, lower),
 709              interpolated_pt(cell_pts[0], cell_pts[1], lower)
 710          ] 
 711      ] : [
 712          [
 713              interpolated_pt(cell_pts[0], cell_pts[1], lower),
 714              [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
 715              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 716              interpolated_pt(cell_pts[3], center_p, lower),
 717              interpolated_pt(cell_pts[3], center_p, upper),
 718              interpolated_pt(cell_pts[0], center_p, upper),
 719              interpolated_pt(cell_pts[1], center_p, upper),
 720              interpolated_pt(cell_pts[1], center_p, lower)
 721          ],
 722          [
 723              interpolated_pt(cell_pts[1], cell_pts[2], lower),
 724              interpolated_pt(cell_pts[1], center_p, lower),
 725              interpolated_pt(cell_pts[1], center_p, upper),
 726              interpolated_pt(cell_pts[2], center_p, upper),
 727              interpolated_pt(cell_pts[3], center_p, upper),
 728              interpolated_pt(cell_pts[3], center_p, lower),
 729              interpolated_pt(cell_pts[2], cell_pts[3], lower),
 730              [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z]
 731          ]
 732      ];
 733  
 734  function _case1010_isobands(cell_pts, lower, upper) = 
 735      let(
 736          center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4,
 737          center_p_z = center_p[2]
 738      )
 739      center_p_z < lower ? [
 740          [
 741              interpolated_pt(cell_pts[0], cell_pts[1], lower),
 742              interpolated_pt(cell_pts[1], center_p, lower),
 743              interpolated_pt(cell_pts[1], cell_pts[2], lower),
 744              [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z]
 745          ],
 746          [
 747              interpolated_pt(cell_pts[3], center_p, lower),
 748              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 749              [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
 750              interpolated_pt(cell_pts[2], cell_pts[3], lower)
 751          ]        
 752      ] : 
 753      center_p_z >= lower && center_p_z <= upper ? [
 754          [
 755              interpolated_pt(cell_pts[0], center_p, lower),
 756              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 757              [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
 758              interpolated_pt(cell_pts[2], cell_pts[3], lower),
 759              interpolated_pt(cell_pts[2], center_p, lower),
 760              interpolated_pt(cell_pts[1], cell_pts[2], lower),
 761              [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z],
 762              interpolated_pt(cell_pts[0], cell_pts[1], lower)
 763          ]
 764      ] : [
 765          [
 766              [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z],
 767              interpolated_pt(cell_pts[0], cell_pts[1], lower),
 768              interpolated_pt(cell_pts[0], center_p, lower),
 769              interpolated_pt(cell_pts[0], center_p, upper),
 770              interpolated_pt(cell_pts[1], center_p, upper),
 771              interpolated_pt(cell_pts[2], center_p, upper),
 772              interpolated_pt(cell_pts[2], center_p, lower),
 773              interpolated_pt(cell_pts[1], cell_pts[2], lower)
 774          ],
 775          [
 776              interpolated_pt(cell_pts[0], center_p, lower),
 777              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 778              [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
 779              interpolated_pt(cell_pts[2], cell_pts[3], lower),
 780              interpolated_pt(cell_pts[2], center_p, lower),
 781              interpolated_pt(cell_pts[2], center_p, upper),
 782              interpolated_pt(cell_pts[3], center_p, upper),
 783              interpolated_pt(cell_pts[0], center_p, upper)
 784          ]
 785      ];    
 786  
 787  function _case2121_isobands(cell_pts, lower, upper) = 
 788      let(
 789          center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4,
 790          center_p_z = center_p[2]
 791      )
 792      center_p_z < lower ? [
 793          [
 794              interpolated_pt(cell_pts[1], cell_pts[2], upper),
 795              interpolated_pt(cell_pts[1], center_p, upper),
 796              interpolated_pt(cell_pts[1], center_p, lower),
 797              interpolated_pt(cell_pts[2], center_p, lower),
 798              interpolated_pt(cell_pts[3], center_p, lower),
 799              interpolated_pt(cell_pts[3], center_p, upper),
 800              interpolated_pt(cell_pts[2], cell_pts[3], upper),
 801              [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z]
 802          ],
 803          [
 804              interpolated_pt(cell_pts[1], center_p, upper),
 805              interpolated_pt(cell_pts[0], cell_pts[1], upper),
 806              [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
 807              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 808              interpolated_pt(cell_pts[3], center_p, upper),
 809              interpolated_pt(cell_pts[3], center_p, lower),
 810              interpolated_pt(cell_pts[0], center_p, lower),
 811              interpolated_pt(cell_pts[1], center_p, lower)
 812          ]
 813      ] :
 814      center_p_z >= lower && center_p_z <= upper ? [
 815          [
 816              [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
 817              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 818              interpolated_pt(cell_pts[3], center_p, upper),
 819              interpolated_pt(cell_pts[2], cell_pts[3], upper),
 820              [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 821              interpolated_pt(cell_pts[1], cell_pts[2], upper),
 822              interpolated_pt(cell_pts[1], center_p, upper),
 823              interpolated_pt(cell_pts[0], cell_pts[1], upper)
 824          ]
 825      ] : [
 826          [
 827              [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
 828              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 829              interpolated_pt(cell_pts[0], center_p, upper),
 830              interpolated_pt(cell_pts[0], cell_pts[1], upper)
 831          ],
 832          [
 833              interpolated_pt(cell_pts[2], cell_pts[3], upper),
 834              [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 835              interpolated_pt(cell_pts[1], cell_pts[2], upper),
 836              interpolated_pt(cell_pts[2], center_p, upper)
 837          ]        
 838      ];        
 839  
 840  function _case1212_isobands(cell_pts, lower, upper) = 
 841      let(
 842          center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4,
 843          center_p_z = center_p[2]
 844      )
 845      center_p_z < lower ? [
 846          [
 847              [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z],
 848              interpolated_pt(cell_pts[0], cell_pts[1], upper),
 849              interpolated_pt(cell_pts[0], center_p, upper),
 850              interpolated_pt(cell_pts[0], center_p, lower),
 851              interpolated_pt(cell_pts[1], center_p, lower),
 852              interpolated_pt(cell_pts[2], center_p, lower),
 853              interpolated_pt(cell_pts[2], center_p, upper),
 854              interpolated_pt(cell_pts[1], cell_pts[2], lower)
 855          ],
 856          [
 857              interpolated_pt(cell_pts[0], center_p, upper),
 858              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 859              [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
 860              interpolated_pt(cell_pts[2], cell_pts[3], upper),
 861              interpolated_pt(cell_pts[2], center_p, upper),
 862              interpolated_pt(cell_pts[2], center_p, lower),
 863              interpolated_pt(cell_pts[3], center_p, lower),
 864              interpolated_pt(cell_pts[0], center_p, lower)
 865          ]
 866      ] :
 867      center_p_z >= lower && center_p_z <= upper ? [
 868          [
 869              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 870              [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
 871              interpolated_pt(cell_pts[2], cell_pts[3], upper),
 872              interpolated_pt(cell_pts[2], cell_pts[3], upper),
 873              interpolated_pt(cell_pts[2], center_p, upper),
 874              [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z],
 875              interpolated_pt(cell_pts[0], cell_pts[1], upper),
 876              interpolated_pt(cell_pts[0], center_p, upper)
 877          ]
 878      ] : [
 879          [
 880              interpolated_pt(cell_pts[0], cell_pts[1], upper),
 881              interpolated_pt(cell_pts[1], center_p, upper),
 882              interpolated_pt(cell_pts[1], cell_pts[2], upper),
 883              [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z]
 884          ],
 885          [
 886              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 887              [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
 888              interpolated_pt(cell_pts[2], cell_pts[3], upper),
 889              interpolated_pt(cell_pts[3], center_p, upper)
 890          ]        
 891      ];            
 892  
 893  function _case2120_isobands(cell_pts, lower, upper) = 
 894      let(
 895          center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4,
 896          center_p_z = center_p[2]
 897      )
 898      center_p_z < lower ? [
 899          [
 900              interpolated_pt(cell_pts[1], cell_pts[2], upper),
 901              interpolated_pt(cell_pts[1], center_p, upper),
 902              interpolated_pt(cell_pts[0], cell_pts[1], upper),
 903              interpolated_pt(cell_pts[0], cell_pts[1], lower),
 904              interpolated_pt(cell_pts[1], center_p, lower),
 905              interpolated_pt(cell_pts[2], center_p, lower),
 906              interpolated_pt(cell_pts[3], center_p, lower),
 907              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 908              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 909              interpolated_pt(cell_pts[3], center_p, upper),
 910              interpolated_pt(cell_pts[2], cell_pts[3], upper),
 911              [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z]
 912          ]
 913      ] :
 914      center_p_z >= lower && center_p_z <= upper ? [
 915          [
 916              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 917              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 918              interpolated_pt(cell_pts[3], center_p, upper),
 919              interpolated_pt(cell_pts[2], cell_pts[3], upper),
 920              [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 921              interpolated_pt(cell_pts[1], cell_pts[2], upper),
 922              interpolated_pt(cell_pts[1], center_p, upper),
 923              interpolated_pt(cell_pts[0], cell_pts[1], upper),
 924              interpolated_pt(cell_pts[0], cell_pts[1], lower),
 925              interpolated_pt(cell_pts[0], center_p, lower)
 926          ]     
 927      ] : [
 928          [
 929              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 930              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 931              interpolated_pt(cell_pts[0], center_p, upper),
 932              interpolated_pt(cell_pts[0], cell_pts[1], upper), 
 933              interpolated_pt(cell_pts[0], cell_pts[1], lower),
 934              interpolated_pt(cell_pts[0], center_p, lower)
 935          ],
 936          [
 937              interpolated_pt(cell_pts[2], cell_pts[3], upper),
 938              [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 939              interpolated_pt(cell_pts[1], cell_pts[2], upper),
 940              interpolated_pt(cell_pts[3], center_p, upper)
 941          ]
 942      ];
 943      
 944  function _case0102_isobands(cell_pts, lower, upper) = 
 945      let(
 946          center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4,
 947          center_p_z = center_p[2]
 948      )
 949      center_p_z < lower ? [
 950          [
 951              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 952              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 953              interpolated_pt(cell_pts[0], center_p, lower),
 954              interpolated_pt(cell_pts[0], cell_pts[1], lower), 
 955              interpolated_pt(cell_pts[0], cell_pts[1], upper),
 956              interpolated_pt(cell_pts[0], center_p, upper)
 957          ],
 958          [
 959              interpolated_pt(cell_pts[2], center_p, lower),
 960              interpolated_pt(cell_pts[2], cell_pts[3], lower),
 961              [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 962              interpolated_pt(cell_pts[1], cell_pts[2], lower)
 963          ]
 964      ] : 
 965      center_p_z >= lower && center_p_z <= upper ? [
 966          [
 967              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 968              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 969              interpolated_pt(cell_pts[3], center_p, lower),
 970              interpolated_pt(cell_pts[2], cell_pts[3], lower),
 971              [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z],
 972              interpolated_pt(cell_pts[1], cell_pts[2], lower),
 973              interpolated_pt(cell_pts[1], center_p, lower),
 974              interpolated_pt(cell_pts[0], cell_pts[1], lower),
 975              interpolated_pt(cell_pts[0], cell_pts[1], upper)
 976          ]     
 977      ] : [
 978          [
 979              interpolated_pt(cell_pts[1], cell_pts[2], lower),
 980              interpolated_pt(cell_pts[1], center_p, lower),
 981              interpolated_pt(cell_pts[0], cell_pts[1], lower),
 982              interpolated_pt(cell_pts[0], cell_pts[1], upper),
 983              interpolated_pt(cell_pts[1], center_p, upper),
 984              interpolated_pt(cell_pts[2], center_p, upper),
 985              interpolated_pt(cell_pts[3], center_p, upper),
 986              interpolated_pt(cell_pts[0], cell_pts[3], upper),
 987              interpolated_pt(cell_pts[0], cell_pts[3], lower),
 988              interpolated_pt(cell_pts[3], center_p, lower),
 989              interpolated_pt(cell_pts[2], cell_pts[3], lower),
 990              [cell_pts[2].x, cell_pts[2].y, cell_pts[2].z]
 991          ]
 992      ];    
 993  
 994  function _case2021_isobands(cell_pts, lower, upper) = 
 995      let(
 996          center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4,
 997          center_p_z = center_p[2]
 998      )
 999      center_p_z < lower ? [
1000          [
1001              interpolated_pt(cell_pts[1], cell_pts[2], upper),
1002              interpolated_pt(cell_pts[1], center_p, upper),
1003              interpolated_pt(cell_pts[0], cell_pts[1], upper),
1004              [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
1005              interpolated_pt(cell_pts[0], cell_pts[3], upper),
1006              interpolated_pt(cell_pts[3], center_p, upper),
1007              interpolated_pt(cell_pts[2], cell_pts[3], upper),
1008              interpolated_pt(cell_pts[2], cell_pts[3], lower),
1009              interpolated_pt(cell_pts[3], center_p, lower),
1010              interpolated_pt(cell_pts[0], center_p, lower),
1011              interpolated_pt(cell_pts[1], center_p, lower),
1012              interpolated_pt(cell_pts[1], cell_pts[2], lower)
1013          ]
1014      ] :
1015      center_p_z >= lower && center_p_z <= upper ? [
1016          [
1017              [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
1018              interpolated_pt(cell_pts[0], cell_pts[3], upper),
1019              interpolated_pt(cell_pts[3], center_p, upper),
1020              interpolated_pt(cell_pts[2], cell_pts[3], upper),
1021              interpolated_pt(cell_pts[2], cell_pts[3], lower),
1022              interpolated_pt(cell_pts[2], center_p, upper),
1023              interpolated_pt(cell_pts[1], cell_pts[2], lower),
1024              interpolated_pt(cell_pts[1], cell_pts[2], upper),
1025              interpolated_pt(cell_pts[1], center_p, upper),
1026              interpolated_pt(cell_pts[0], cell_pts[1], upper)
1027          ]     
1028      ] : [
1029          [
1030              [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
1031              interpolated_pt(cell_pts[0], cell_pts[3], upper),
1032              interpolated_pt(cell_pts[0], center_p, upper),
1033              interpolated_pt(cell_pts[0], cell_pts[1], upper)
1034          ],
1035          [
1036              interpolated_pt(cell_pts[2], cell_pts[3], upper),
1037              interpolated_pt(cell_pts[2], cell_pts[3], lower),
1038              interpolated_pt(cell_pts[2], center_p, lower),
1039              interpolated_pt(cell_pts[1], cell_pts[2], lower),
1040              interpolated_pt(cell_pts[1], cell_pts[2], upper),
1041              interpolated_pt(cell_pts[2], center_p, upper)
1042          ]
1043      ];
1044      
1045  function _case0201_isobands(cell_pts, lower, upper) = 
1046      let(
1047          center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4,
1048          center_p_z = center_p[2]
1049      )
1050      center_p_z < lower ? [
1051          [
1052              [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
1053              interpolated_pt(cell_pts[0], cell_pts[3], lower),
1054              interpolated_pt(cell_pts[0], center_p, lower),
1055              interpolated_pt(cell_pts[0], cell_pts[1], lower)
1056          ],
1057          [
1058              interpolated_pt(cell_pts[2], cell_pts[3], lower),
1059              interpolated_pt(cell_pts[2], cell_pts[3], upper),
1060              interpolated_pt(cell_pts[2], center_p, upper),
1061              interpolated_pt(cell_pts[1], cell_pts[2], upper),
1062              interpolated_pt(cell_pts[1], cell_pts[2], lower),
1063              interpolated_pt(cell_pts[2], center_p, lower)
1064          ]
1065      ] :
1066      center_p_z >= lower && center_p_z <= upper ? [
1067          [
1068              [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
1069              interpolated_pt(cell_pts[0], cell_pts[3], lower),
1070              interpolated_pt(cell_pts[3], center_p, lower),
1071              interpolated_pt(cell_pts[2], cell_pts[3], lower),
1072              interpolated_pt(cell_pts[2], cell_pts[3], upper),
1073              interpolated_pt(cell_pts[2], center_p, lower),
1074              interpolated_pt(cell_pts[1], cell_pts[2], upper),
1075              interpolated_pt(cell_pts[1], cell_pts[2], lower),
1076              interpolated_pt(cell_pts[1], center_p, lower),
1077              interpolated_pt(cell_pts[0], cell_pts[1], lower)
1078          ]     
1079      ] : [
1080          [
1081              interpolated_pt(cell_pts[1], cell_pts[2], lower),
1082              interpolated_pt(cell_pts[1], center_p, lower),
1083              interpolated_pt(cell_pts[0], cell_pts[1], lower),
1084              [cell_pts[0].x, cell_pts[0].y, cell_pts[0].z],
1085              interpolated_pt(cell_pts[0], cell_pts[3], lower),
1086              interpolated_pt(cell_pts[3], center_p, lower),
1087              interpolated_pt(cell_pts[2], cell_pts[3], lower),
1088              interpolated_pt(cell_pts[2], cell_pts[3], upper),
1089              interpolated_pt(cell_pts[3], center_p, upper),
1090              interpolated_pt(cell_pts[0], center_p, upper),
1091              interpolated_pt(cell_pts[1], center_p, upper),
1092              interpolated_pt(cell_pts[1], cell_pts[2], upper)
1093          ]
1094      ];    
1095   
1096  function _case1202_isobands(cell_pts, lower, upper) = 
1097      let(
1098          center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4,
1099          center_p_z = center_p[2]
1100      )
1101      center_p_z < lower ? [
1102          [
1103              [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z],
1104              interpolated_pt(cell_pts[0], cell_pts[1], upper),
1105              interpolated_pt(cell_pts[0], center_p, upper),
1106              interpolated_pt(cell_pts[0], cell_pts[3], upper),
1107              interpolated_pt(cell_pts[0], cell_pts[3], lower),
1108              interpolated_pt(cell_pts[0], center_p, lower),
1109              interpolated_pt(cell_pts[1], center_p, lower),
1110              interpolated_pt(cell_pts[2], center_p, lower),
1111              interpolated_pt(cell_pts[2], cell_pts[3], lower),
1112              interpolated_pt(cell_pts[2], cell_pts[3], upper),
1113              interpolated_pt(cell_pts[2], center_p, upper),
1114              interpolated_pt(cell_pts[1], cell_pts[2], upper),
1115          ]
1116      ] :
1117      center_p_z >= lower && center_p_z <= upper ? [
1118          [
1119              interpolated_pt(cell_pts[0], cell_pts[3], upper),
1120              interpolated_pt(cell_pts[0], cell_pts[3], lower),
1121              interpolated_pt(cell_pts[3], center_p, lower),
1122              interpolated_pt(cell_pts[2], cell_pts[3], lower),
1123              interpolated_pt(cell_pts[2], cell_pts[3], upper),
1124              interpolated_pt(cell_pts[2], center_p, upper),
1125              interpolated_pt(cell_pts[1], cell_pts[2], upper),
1126              [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z],
1127              interpolated_pt(cell_pts[0], cell_pts[1], upper),
1128              interpolated_pt(cell_pts[0], center_p, upper)
1129          ]     
1130      ] : [
1131          [
1132              interpolated_pt(cell_pts[0], cell_pts[1], upper),
1133              interpolated_pt(cell_pts[1], center_p, upper),
1134              interpolated_pt(cell_pts[1], cell_pts[2], upper),
1135              [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z]
1136          ],
1137          [
1138              interpolated_pt(cell_pts[0], cell_pts[3], upper),
1139              interpolated_pt(cell_pts[0], cell_pts[3], lower),
1140              interpolated_pt(cell_pts[3], center_p, lower),
1141              interpolated_pt(cell_pts[2], cell_pts[3], lower),
1142              interpolated_pt(cell_pts[2], cell_pts[3], upper),
1143              interpolated_pt(cell_pts[3], center_p, upper)
1144          ]
1145      ];
1146  
1147  function _case1020_isobands(cell_pts, lower, upper) = 
1148      let(
1149          center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4,
1150          center_p_z = center_p[2]
1151      )
1152      center_p_z < lower ? [
1153          [
1154              interpolated_pt(cell_pts[0], cell_pts[1], lower),
1155              interpolated_pt(cell_pts[1], center_p, lower),
1156              interpolated_pt(cell_pts[1], cell_pts[2], lower),
1157              [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z]
1158          ],
1159          [
1160              interpolated_pt(cell_pts[0], cell_pts[3], lower),
1161              interpolated_pt(cell_pts[0], cell_pts[3], upper),
1162              interpolated_pt(cell_pts[3], center_p, upper),
1163              interpolated_pt(cell_pts[2], cell_pts[3], upper),
1164              interpolated_pt(cell_pts[2], cell_pts[3], lower),
1165              interpolated_pt(cell_pts[3], center_p, lower)
1166          ]
1167      ] :
1168      center_p_z >= lower && center_p_z <= upper ? [
1169          [
1170              interpolated_pt(cell_pts[0], cell_pts[3], lower),
1171              interpolated_pt(cell_pts[0], cell_pts[3], upper),
1172              interpolated_pt(cell_pts[3], center_p, upper),
1173              interpolated_pt(cell_pts[2], cell_pts[3], upper),
1174              interpolated_pt(cell_pts[2], cell_pts[3], lower),
1175              interpolated_pt(cell_pts[2], center_p, lower),
1176              interpolated_pt(cell_pts[1], cell_pts[2], lower),
1177              [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z],
1178              interpolated_pt(cell_pts[0], cell_pts[1], lower),
1179              interpolated_pt(cell_pts[0], center_p, lower)
1180          ]     
1181      ] : [
1182          [
1183              [cell_pts[1].x, cell_pts[1].y, cell_pts[1].z],
1184              interpolated_pt(cell_pts[0], cell_pts[1], lower),
1185              interpolated_pt(cell_pts[0], center_p, lower),
1186              interpolated_pt(cell_pts[0], cell_pts[3], lower),
1187              interpolated_pt(cell_pts[0], cell_pts[3], upper),
1188              interpolated_pt(cell_pts[0], center_p, upper),
1189              interpolated_pt(cell_pts[1], center_p, upper),
1190              interpolated_pt(cell_pts[2], center_p, upper),
1191              interpolated_pt(cell_pts[2], cell_pts[3], upper),
1192              interpolated_pt(cell_pts[2], cell_pts[3], lower),
1193              interpolated_pt(cell_pts[2], center_p, lower),
1194              interpolated_pt(cell_pts[1], cell_pts[2], lower)
1195          ]
1196      ];    
1197      
1198  function _case0212_isobands(cell_pts, lower, upper) = 
1199      let(
1200          center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4,
1201          center_p_z = center_p[2]
1202      )
1203      center_p_z < lower ? [
1204          [
1205              interpolated_pt(cell_pts[0], cell_pts[1], lower),
1206              interpolated_pt(cell_pts[0], cell_pts[1], upper),
1207              interpolated_pt(cell_pts[0], center_p, upper),
1208              interpolated_pt(cell_pts[0], cell_pts[3], upper),
1209              [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
1210              interpolated_pt(cell_pts[2], cell_pts[3], upper),
1211              interpolated_pt(cell_pts[2], center_p, upper),
1212              interpolated_pt(cell_pts[1], cell_pts[2], upper),
1213              interpolated_pt(cell_pts[1], cell_pts[2], lower),
1214              interpolated_pt(cell_pts[2], center_p, lower),
1215              interpolated_pt(cell_pts[3], center_p, lower),
1216              interpolated_pt(cell_pts[0], center_p, lower)
1217          ]
1218      ] :
1219      center_p_z >= lower && center_p_z <= upper ? [
1220          [
1221              interpolated_pt(cell_pts[0], cell_pts[3], upper),
1222              [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
1223              interpolated_pt(cell_pts[2], cell_pts[3], upper),
1224              interpolated_pt(cell_pts[2], center_p, upper),
1225              interpolated_pt(cell_pts[1], cell_pts[2], upper),
1226              interpolated_pt(cell_pts[1], cell_pts[2], lower),
1227              interpolated_pt(cell_pts[1], center_p, lower),
1228              interpolated_pt(cell_pts[0], cell_pts[1], lower),
1229              interpolated_pt(cell_pts[0], cell_pts[1], upper),
1230              interpolated_pt(cell_pts[0], center_p, upper)
1231          ]     
1232      ] : [
1233          [
1234              interpolated_pt(cell_pts[0], cell_pts[1], upper),
1235              interpolated_pt(cell_pts[1], center_p, upper),
1236              interpolated_pt(cell_pts[1], cell_pts[2], upper),
1237              interpolated_pt(cell_pts[1], cell_pts[2], lower),
1238              interpolated_pt(cell_pts[1], center_p, lower),
1239              interpolated_pt(cell_pts[0], cell_pts[1], lower)
1240          ],
1241          [
1242              interpolated_pt(cell_pts[0], cell_pts[3], upper),
1243              [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
1244              interpolated_pt(cell_pts[2], cell_pts[3], upper),
1245              interpolated_pt(cell_pts[3], center_p, upper)
1246          ]
1247      ];    
1248      
1249  function _case2010_isobands(cell_pts, lower, upper) = 
1250      let(
1251          center_p = (cell_pts[0] + cell_pts[1] + cell_pts[2] + cell_pts[3]) / 4,
1252          center_p_z = center_p[2]
1253      )
1254      center_p_z < lower ? [
1255          [
1256              interpolated_pt(cell_pts[0], cell_pts[1], lower),
1257              interpolated_pt(cell_pts[1], center_p, lower),
1258              interpolated_pt(cell_pts[1], cell_pts[2], lower),
1259              interpolated_pt(cell_pts[1], cell_pts[2], upper),
1260              interpolated_pt(cell_pts[1], center_p, upper),
1261              interpolated_pt(cell_pts[0], cell_pts[1], upper)
1262          ],
1263          [
1264              interpolated_pt(cell_pts[3], center_p, lower),
1265              interpolated_pt(cell_pts[0], cell_pts[3], lower),
1266              [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
1267              interpolated_pt(cell_pts[2], cell_pts[3], lower)
1268          ]
1269      ] : 
1270      center_p_z >= lower && center_p_z <= upper ? [
1271          [
1272              interpolated_pt(cell_pts[0], cell_pts[3], lower),
1273              [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
1274              interpolated_pt(cell_pts[2], cell_pts[3], lower),
1275              interpolated_pt(cell_pts[2], center_p, lower),
1276              interpolated_pt(cell_pts[1], cell_pts[2], lower),
1277              interpolated_pt(cell_pts[1], cell_pts[2], upper),
1278              interpolated_pt(cell_pts[1], center_p, upper),
1279              interpolated_pt(cell_pts[0], cell_pts[1], upper),
1280              interpolated_pt(cell_pts[0], cell_pts[1], lower),
1281              interpolated_pt(cell_pts[0], center_p, lower)
1282          ]     
1283      ] : [
1284          [
1285              interpolated_pt(cell_pts[0], cell_pts[1], upper),
1286              interpolated_pt(cell_pts[0], cell_pts[1], lower),
1287              interpolated_pt(cell_pts[0], center_p, lower),
1288              interpolated_pt(cell_pts[0], cell_pts[3], lower),
1289              [cell_pts[3].x, cell_pts[3].y, cell_pts[3].z],
1290              interpolated_pt(cell_pts[2], cell_pts[3], lower),
1291              interpolated_pt(cell_pts[2], center_p, lower),
1292              interpolated_pt(cell_pts[1], cell_pts[2], lower),
1293              interpolated_pt(cell_pts[1], cell_pts[2], upper),
1294              interpolated_pt(cell_pts[2], center_p, upper),
1295              interpolated_pt(cell_pts[3], center_p, upper),
1296              interpolated_pt(cell_pts[0], center_p, upper)
1297          ]
1298      ];        
1299   
1300  function _isobands_of(cell_pts, lower, upper) =    
1301      let(cv = _isobands_corner_value(cell_pts))
1302      // no contour
1303      cv == "0000" || cv == "2222" ? [] : 
1304      // single square
1305      cv == "1111" ? [[for(i = 3; i >= 0; i = i - 1) [cell_pts[i][0], cell_pts[i][1]]]] :
1306      // single triangle
1307      cv == "2221" ? _case2221_isobands(cell_pts, upper) :
1308      cv == "2212" ? _case2212_isobands(cell_pts, upper) :
1309      cv == "2122" ? _case2122_isobands(cell_pts, upper) :
1310      cv == "1222" ? _case1222_isobands(cell_pts, upper) :
1311      cv == "0001" ? _case0001_isobands(cell_pts, lower) :
1312      cv == "0010" ? _case0010_isobands(cell_pts, lower) :
1313      cv == "0100" ? _case0100_isobands(cell_pts, lower) :
1314      cv == "1000" ? _case1000_isobands(cell_pts, lower) :
1315      // single trapezoid
1316      cv == "2220" ? _case2220_isobands(cell_pts, lower, upper) :
1317      cv == "2202" ? _case2202_isobands(cell_pts, lower, upper) :
1318      cv == "2022" ? _case2022_isobands(cell_pts, lower, upper) :
1319      cv == "0222" ? _case0222_isobands(cell_pts, lower, upper) :   
1320      cv == "0002" ? _case0002_isobands(cell_pts, lower, upper) :       
1321      cv == "0020" ? _case0020_isobands(cell_pts, lower, upper) :
1322      cv == "0200" ? _case0200_isobands(cell_pts, lower, upper) :    
1323      cv == "2000" ? _case2000_isobands(cell_pts, lower, upper) :     
1324      // single rectangle  
1325      cv == "0011" ? _case0011_isobands(cell_pts, lower) :
1326      cv == "0110" ? _case0110_isobands(cell_pts, lower) :
1327      cv == "1100" ? _case1100_isobands(cell_pts, lower) : 
1328      cv == "1001" ? _case1001_isobands(cell_pts, lower) :
1329      cv == "2211" ? _case2211_isobands(cell_pts, upper) :
1330      cv == "2112" ? _case2112_isobands(cell_pts, upper) :  
1331      cv == "1122" ? _case1122_isobands(cell_pts, upper) :
1332      cv == "1221" ? _case1221_isobands(cell_pts, upper) :
1333      cv == "2200" ? _case2200_isobands(cell_pts, lower, upper) :
1334      cv == "2002" ? _case2002_isobands(cell_pts, lower, upper) :    
1335      cv == "0022" ? _case0022_isobands(cell_pts, lower, upper) :     
1336      cv == "0220" ? _case0220_isobands(cell_pts, lower, upper) :     
1337      // single hexagon
1338      cv == "0211" ? _case0211_isobands(cell_pts, lower, upper) :   
1339      cv == "2110" ? _case2110_isobands(cell_pts, lower, upper) :       
1340      cv == "1102" ? _case1102_isobands(cell_pts, lower, upper) :      
1341      cv == "1021" ? _case1021_isobands(cell_pts, lower, upper) :     
1342      cv == "2011" ? _case2011_isobands(cell_pts, lower, upper) :     
1343      cv == "0112" ? _case0112_isobands(cell_pts, lower, upper) :     
1344      cv == "1120" ? _case1120_isobands(cell_pts, lower, upper) :        
1345      cv == "1201" ? _case1201_isobands(cell_pts, lower, upper) :       
1346      cv == "2101" ? _case2101_isobands(cell_pts, lower, upper) :        
1347      cv == "0121" ? _case0121_isobands(cell_pts, lower, upper) :      
1348      cv == "1012" ? _case1012_isobands(cell_pts, lower, upper) :       
1349      cv == "1210" ? _case1210_isobands(cell_pts, lower, upper) :     
1350      // single pentagon
1351      cv == "1211" ? _case1211_isobands(cell_pts, upper) :
1352      cv == "2111" ? _case2111_isobands(cell_pts, upper) :
1353      cv == "1112" ? _case1112_isobands(cell_pts, upper) :   
1354      cv == "1121" ? _case1121_isobands(cell_pts, upper) :
1355      cv == "1011" ? _case1011_isobands(cell_pts, lower) :
1356      cv == "0111" ? _case0111_isobands(cell_pts, lower) :
1357      cv == "1110" ? _case1110_isobands(cell_pts, lower) :   
1358      cv == "1101" ? _case1101_isobands(cell_pts, lower) :  
1359      cv == "1200" ? _case1200_isobands(cell_pts, lower, upper) :      
1360      cv == "0120" ? _case0120_isobands(cell_pts, lower, upper) :   
1361      cv == "0012" ? _case0012_isobands(cell_pts, lower, upper) :      
1362      cv == "2001" ? _case2001_isobands(cell_pts, lower, upper) :    
1363      cv == "1022" ? _case1022_isobands(cell_pts, lower, upper) :      
1364      cv == "2102" ? _case2102_isobands(cell_pts, lower, upper) :   
1365      cv == "2210" ? _case2210_isobands(cell_pts, lower, upper) :      
1366      cv == "0221" ? _case0221_isobands(cell_pts, lower, upper) :
1367      cv == "1002" ? _case1002_isobands(cell_pts, lower, upper) :      
1368      cv == "2100" ? _case2100_isobands(cell_pts, lower, upper) :   
1369      cv == "0210" ? _case0210_isobands(cell_pts, lower, upper) :    
1370      cv == "0021" ? _case0021_isobands(cell_pts, lower, upper) :        
1371      cv == "1220" ? _case1220_isobands(cell_pts, lower, upper) :      
1372      cv == "0122" ? _case0122_isobands(cell_pts, lower, upper) :   
1373      cv == "2012" ? _case2012_isobands(cell_pts, lower, upper) :    
1374      cv == "2201" ? _case2201_isobands(cell_pts, lower, upper) : 
1375      // Saddles
1376      cv == "2020" ? _case2020_isobands(cell_pts, lower, upper) :
1377      cv == "0202" ? _case0202_isobands(cell_pts, lower, upper) :
1378      cv == "0101" ? _case0101_isobands(cell_pts, lower, upper) :
1379      cv == "1010" ? _case1010_isobands(cell_pts, lower, upper) :
1380      cv == "2121" ? _case2121_isobands(cell_pts, lower, upper) :    
1381      cv == "1212" ? _case1212_isobands(cell_pts, lower, upper) : 
1382      cv == "2120" ? _case2120_isobands(cell_pts, lower, upper) :    
1383      cv == "0102" ? _case0102_isobands(cell_pts, lower, upper) :   
1384      cv == "2021" ? _case2021_isobands(cell_pts, lower, upper) : 
1385      cv == "0201" ? _case0201_isobands(cell_pts, lower, upper) : 
1386      cv == "1202" ? _case1202_isobands(cell_pts, lower, upper) :      
1387      cv == "1020" ? _case1020_isobands(cell_pts, lower, upper) :  
1388      cv == "0212" ? _case0212_isobands(cell_pts, lower, upper) :  
1389                     _case2010_isobands(cell_pts, lower, upper);
1390      
1391  function _marching_squares_isobands(points, lower, upper) = 
1392      let(labeled_pts = _isobands_tri_label(points, lower, upper))
1393      [
1394          for(y = [0:len(labeled_pts) - 2])
1395              let(labeled_pts_y = labeled_pts[y], labeled_pts_y_1 = labeled_pts[y + 1])
1396              for(x = [0:len(labeled_pts[0]) - 2])
1397                  each _isobands_of(
1398                      [
1399                          labeled_pts_y[x],
1400                          labeled_pts_y_1[x],
1401                          labeled_pts_y_1[x + 1],
1402                          labeled_pts_y[x + 1]
1403                      ], 
1404                      lower, upper
1405                  )
1406      ];
1407      
1408  /*
1409      ISOBANDS Impl End ============================
1410  */