_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 */