├── .gitignore ├── Cargo.toml ├── LICENSE ├── README.md ├── doc ├── pv-teapot.png ├── skillet-teapot.png └── skillet.gif ├── res ├── colormaps.json ├── hex.vtu ├── ico-tensor.vtu ├── ico.vtu ├── ico64.vtu ├── icon.png └── teapot.vtu ├── run.sh ├── src ├── app.rs ├── background.rs ├── colormaps.rs ├── consts.rs ├── edge.glsl ├── frag.glsl ├── lib.rs ├── main.rs ├── math.rs ├── model.rs ├── shaders.rs ├── utils.rs └── vert.glsl └── utils ├── genhex.py └── genhsv.py /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /target 3 | /Cargo.lock 4 | /scratch 5 | 6 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "skillet" 3 | version = "0.4.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | #glium = "*" 10 | glium = "0.32.1" 11 | image = "0.24.3" 12 | serde_json = "1.0.85" 13 | vtkio = "0.6" 14 | 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2022, Jeff Irwin 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | *It's not rust, it's a layer of seasoning!* 3 | 4 | # Skillet 5 | 6 | Skillet is a lightweight, deep-fried, rust application for interactive scientific visualization with [vtkio](https://github.com/elrnv/vtkio) and [glium](https://github.com/glium/glium). 7 | 8 | Compare skillet with [ParaView](https://www.paraview.org/): 9 | 10 | | Skillet | ParaView | 11 | | ----------- | ----------- | 12 | | ![](doc/skillet.gif) | ![](doc/pv-teapot.png) | 13 | 14 | # Run 15 | 16 | Provide the `.vtu` filename as an argument: 17 | 18 | cargo run ./res/teapot.vtu 19 | 20 | You can try one of the provided `.vtu` files in the `./res/` directory. 21 | 22 | Equivalently: 23 | 24 | cargo build 25 | # or "cargo build --release" 26 | 27 | ./target/debug/skillet.exe ./res/teapot.vtu 28 | 29 | # or "./target/release/skillet.exe ./res/teapot.vtu" 30 | 31 | 32 | 33 | ## Mouse controls 34 | 35 | Mouse controls mostly follow the ParaView conventions. 36 | 37 | ### LMB drag: rotate 38 | 39 | LMB means "left mouse button". 40 | 41 | ### Mouse wheel scroll: zoom 42 | 43 | ### MMB drag: pan 44 | 45 | ### RMB vertical drag: z pan 46 | 47 | Z pan is similar to scroll zooming. 48 | 49 | 50 | 51 | ## Key controls (case-sensitive) 52 | 53 | ### `c`: cycle vector/tensor component 54 | 55 | ### `d`: cycle point data or cell data array 56 | 57 | ### `e`: toggle edge visibility 58 | 59 | ### `m`: cycle colormap 60 | 61 | ### `w`: cycle warp by vector point data array 62 | 63 | Cell data arrays, scalars, and tensors cannot be used as a warp basis. Only 64 | point data vector arrays are a valid basis. 65 | 66 | To turn off warp by vector, continue cycling with `w` until all vectors have 67 | been cycled through. 68 | 69 | ### `Ctrl+w`: Decrease warp by vector scale factor 70 | 71 | ### `Shift+w`: Increase warp by vector scale factor 72 | 73 | 74 | 75 | # Features 76 | 77 | ## Data array types 78 | 79 | | Data array | Skillet support? | 80 | | ----------- | ----------- | 81 | | Point data | ✔ | 82 | | Cell data | ✔ | 83 | | Scalars | ✔ | 84 | | Vectors | ✔ | 85 | | Tensors | ✔ | 86 | | Generic | ✔ | 87 | | Field attributes | ❌ | 88 | 89 | ## Cell types 90 | 91 | Skillet displays color contours on surfaces. As such, it doesn't make sense to 92 | try to display 0D or 1D cells like `VTK_VERTEX` or `VTK_LINE`. I might 93 | implement types like triangle strips and quadratic cells if I can get some test 94 | data. 95 | 96 | | Cell | Skillet support? | 97 | | ----------- | ----------- | 98 | | Triangle | ✔ | 99 | | Quad | ✔ | 100 | | Tetra | ✔ | 101 | | Hexahedron | ✔ | 102 | | Wedge | ✔ | 103 | | Pyramid | ✔ | 104 | | Vertex cells | ❌ | 105 | | Line cells | ❌ | 106 | | Triangle strip | ❌ | 107 | | Polygon | ❌ | 108 | | Pixel | ❌ | 109 | | Voxel | ❌ | 110 | | Quadratic cells | ❌ | 111 | 112 | ## File formats 113 | 114 | Only binary/ascii `.vtu` files are supported. Most formats can be converted to `.vtu` in ParaView like this: 115 | 116 | 1. Filters -> alphabetical -> append dataset -> apply 117 | 2. File -> save data -> VTK UnstructuredGrid files (\*.vtu) -> OK -> data mode binary or 118 | ascii 119 | 120 | | File | Extension | Skillet support? | 121 | | ----------- | --------- | ----------- | 122 | | Unstructured grid | `.vtu` | ✔ | 123 | | Image data | `.vti` | ❌ | 124 | | Poly data | `.vtp` | ❌ | 125 | | Rectilinear grid | `.vtr` | ❌ | 126 | | Structured grid | `.vts` | ❌ | 127 | | Parallel files | `.*pv*` | ❌ | 128 | | Legacy files | `.vtk` | ❌ | 129 | | Multiple piece data | `.*` | ❌ | 130 | 131 | | Data mode | Skillet support? | 132 | | --------- | ---------------- | 133 | | Ascii | ✔ | 134 | | Binary | ✔ | 135 | | Appended | ❌ | 136 | 137 | ## Operating systems 138 | 139 | | OS | Skillet support? | 140 | | ----------- | ----------- | 141 | | Windows | ✔ | 142 | | Ubuntu | ❌ | 143 | 144 | On Ubuntu, the glutin dependency has an issue finding the fontconfig package. 145 | Your mileage may vary: https://unix.stackexchange.com/questions/330068/package-fontconfig-not-found-despite-having-installed-libfontconfig1-dev 146 | 147 | -------------------------------------------------------------------------------- /doc/pv-teapot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffIrwin/skillet/31652683b365dce59427268d2e4c3c310f08001c/doc/pv-teapot.png -------------------------------------------------------------------------------- /doc/skillet-teapot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffIrwin/skillet/31652683b365dce59427268d2e4c3c310f08001c/doc/skillet-teapot.png -------------------------------------------------------------------------------- /doc/skillet.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffIrwin/skillet/31652683b365dce59427268d2e4c3c310f08001c/doc/skillet.gif -------------------------------------------------------------------------------- /res/colormaps.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "ColorSpace" : "RGB", 4 | "Name" : "rainbow", 5 | "RGBPoints" : 6 | [ 7 | -1, 8 | 0, 9 | 0, 10 | 1, 11 | 12 | -1, 13 | 0, 14 | 0.25, 15 | 1, 16 | 17 | -1, 18 | 0, 19 | 0.5, 20 | 1, 21 | 22 | -1, 23 | 0, 24 | 0.75, 25 | 1, 26 | 27 | -1, 28 | 0, 29 | 1, 30 | 1, 31 | 32 | -1, 33 | 0, 34 | 1, 35 | 0.75, 36 | 37 | -1, 38 | 0, 39 | 1, 40 | 0.5, 41 | 42 | -1, 43 | 0, 44 | 1, 45 | 0.25, 46 | 47 | -1, 48 | 0, 49 | 1, 50 | 0, 51 | 52 | -1, 53 | 0.25, 54 | 1, 55 | 0, 56 | 57 | -1, 58 | 0.5, 59 | 1, 60 | 0, 61 | 62 | -1, 63 | 0.75, 64 | 1, 65 | 0, 66 | 67 | -1, 68 | 1, 69 | 1, 70 | 0, 71 | 72 | -1, 73 | 1, 74 | 0.75, 75 | 0, 76 | 77 | -1, 78 | 1, 79 | 0.5, 80 | 0, 81 | 82 | -1, 83 | 1, 84 | 0.25, 85 | 0, 86 | 87 | -1, 88 | 1, 89 | 0, 90 | 0 91 | ] 92 | }, 93 | { 94 | "ColorSpace" : "Diverging", 95 | "Creator" : "Nathaniel J. Smith & Stefan van der Walt", 96 | "DefaultMap" : true, 97 | "License" : "CC0", 98 | "Name" : "Inferno (matplotlib)", 99 | "NanColor" : 100 | [ 101 | 0, 102 | 1, 103 | 0 104 | ], 105 | "RGBPoints" : 106 | [ 107 | 0.0, 108 | 0.001462, 109 | 0.000466, 110 | 0.013866, 111 | 0.0039220000000000001, 112 | 0.0022669999999999999, 113 | 0.0012700000000000001, 114 | 0.01857, 115 | 0.0078429999999999993, 116 | 0.0032989999999999998, 117 | 0.0022490000000000001, 118 | 0.024239, 119 | 0.011764999999999999, 120 | 0.0045469999999999998, 121 | 0.003392, 122 | 0.030908999999999999, 123 | 0.015685999999999999, 124 | 0.0060060000000000001, 125 | 0.004692, 126 | 0.038558000000000002, 127 | 0.019608, 128 | 0.0076759999999999997, 129 | 0.006136, 130 | 0.046836000000000003, 131 | 0.023529000000000001, 132 | 0.0095610000000000001, 133 | 0.0077130000000000002, 134 | 0.055142999999999998, 135 | 0.027451, 136 | 0.011663, 137 | 0.009417, 138 | 0.063460000000000003, 139 | 0.031372999999999998, 140 | 0.013995, 141 | 0.011225000000000001, 142 | 0.071861999999999995, 143 | 0.035293999999999999, 144 | 0.016560999999999999, 145 | 0.013136, 146 | 0.080282000000000006, 147 | 0.039216000000000001, 148 | 0.019373000000000001, 149 | 0.015133000000000001, 150 | 0.088766999999999999, 151 | 0.043137000000000002, 152 | 0.022447000000000002, 153 | 0.017198999999999999, 154 | 0.097326999999999997, 155 | 0.047058999999999997, 156 | 0.025793, 157 | 0.019331000000000001, 158 | 0.10593, 159 | 0.050979999999999998, 160 | 0.029432, 161 | 0.021503000000000001, 162 | 0.114621, 163 | 0.054901999999999999, 164 | 0.033384999999999998, 165 | 0.023702000000000001, 166 | 0.12339700000000001, 167 | 0.058824000000000001, 168 | 0.037668, 169 | 0.025921, 170 | 0.13223199999999999, 171 | 0.062744999999999995, 172 | 0.042252999999999999, 173 | 0.028139000000000001, 174 | 0.14114099999999999, 175 | 0.066667000000000004, 176 | 0.046914999999999998, 177 | 0.030324, 178 | 0.15016399999999999, 179 | 0.070587999999999998, 180 | 0.051644000000000002, 181 | 0.032474000000000003, 182 | 0.15925400000000001, 183 | 0.074510000000000007, 184 | 0.056448999999999999, 185 | 0.034569000000000003, 186 | 0.16841400000000001, 187 | 0.078431000000000001, 188 | 0.061339999999999999, 189 | 0.036589999999999998, 190 | 0.17764199999999999, 191 | 0.082352999999999996, 192 | 0.066331000000000001, 193 | 0.038503999999999997, 194 | 0.18696199999999999, 195 | 0.086275000000000004, 196 | 0.071429000000000006, 197 | 0.040294000000000003, 198 | 0.196354, 199 | 0.090195999999999998, 200 | 0.076636999999999997, 201 | 0.041904999999999998, 202 | 0.20579900000000001, 203 | 0.094117999999999993, 204 | 0.081961999999999993, 205 | 0.043327999999999998, 206 | 0.21528900000000001, 207 | 0.098039000000000001, 208 | 0.087411000000000003, 209 | 0.044555999999999998, 210 | 0.22481300000000001, 211 | 0.101961, 212 | 0.092990000000000003, 213 | 0.045582999999999999, 214 | 0.23435800000000001, 215 | 0.105882, 216 | 0.098701999999999998, 217 | 0.046401999999999999, 218 | 0.24390400000000001, 219 | 0.109804, 220 | 0.10455100000000001, 221 | 0.047008000000000001, 222 | 0.25342999999999999, 223 | 0.11372500000000001, 224 | 0.110536, 225 | 0.047398999999999997, 226 | 0.26291199999999998, 227 | 0.117647, 228 | 0.116656, 229 | 0.047573999999999998, 230 | 0.27232099999999998, 231 | 0.121569, 232 | 0.122908, 233 | 0.047536000000000002, 234 | 0.28162399999999999, 235 | 0.12548999999999999, 236 | 0.12928500000000001, 237 | 0.047293000000000002, 238 | 0.29078799999999999, 239 | 0.129412, 240 | 0.13577800000000001, 241 | 0.046856000000000002, 242 | 0.29977599999999999, 243 | 0.13333300000000001, 244 | 0.142378, 245 | 0.046241999999999998, 246 | 0.30855300000000002, 247 | 0.13725499999999999, 248 | 0.14907300000000001, 249 | 0.045468000000000001, 250 | 0.31708500000000001, 251 | 0.141176, 252 | 0.15584999999999999, 253 | 0.044559000000000001, 254 | 0.32533800000000002, 255 | 0.145098, 256 | 0.162689, 257 | 0.043554000000000002, 258 | 0.33327699999999999, 259 | 0.14902000000000001, 260 | 0.169575, 261 | 0.042488999999999999, 262 | 0.34087400000000001, 263 | 0.15294099999999999, 264 | 0.17649300000000001, 265 | 0.041402000000000001, 266 | 0.348111, 267 | 0.156863, 268 | 0.18342900000000001, 269 | 0.040328999999999997, 270 | 0.35497099999999998, 271 | 0.16078400000000001, 272 | 0.19036700000000001, 273 | 0.039308999999999997, 274 | 0.36144700000000002, 275 | 0.16470599999999999, 276 | 0.197297, 277 | 0.038399999999999997, 278 | 0.367535, 279 | 0.168627, 280 | 0.204209, 281 | 0.037631999999999999, 282 | 0.37323800000000001, 283 | 0.17254900000000001, 284 | 0.211095, 285 | 0.03703, 286 | 0.37856299999999998, 287 | 0.17647099999999999, 288 | 0.217949, 289 | 0.036615000000000002, 290 | 0.38352199999999997, 291 | 0.180392, 292 | 0.22476299999999999, 293 | 0.036405, 294 | 0.388129, 295 | 0.18431400000000001, 296 | 0.23153799999999999, 297 | 0.036405, 298 | 0.39240000000000003, 299 | 0.18823500000000001, 300 | 0.23827300000000001, 301 | 0.036621000000000001, 302 | 0.39635300000000001, 303 | 0.19215699999999999, 304 | 0.24496699999999999, 305 | 0.037054999999999998, 306 | 0.400007, 307 | 0.196078, 308 | 0.25162000000000001, 309 | 0.037705000000000002, 310 | 0.40337800000000001, 311 | 0.20000000000000001, 312 | 0.25823400000000002, 313 | 0.038571000000000001, 314 | 0.40648499999999999, 315 | 0.20392199999999999, 316 | 0.26480999999999999, 317 | 0.039647000000000002, 318 | 0.40934500000000001, 319 | 0.207843, 320 | 0.271347, 321 | 0.040922, 322 | 0.41197600000000001, 323 | 0.21176500000000001, 324 | 0.27784999999999999, 325 | 0.042353000000000002, 326 | 0.41439199999999998, 327 | 0.21568599999999999, 328 | 0.28432099999999999, 329 | 0.043933, 330 | 0.41660799999999998, 331 | 0.219608, 332 | 0.29076299999999999, 333 | 0.045643999999999997, 334 | 0.41863699999999998, 335 | 0.22352900000000001, 336 | 0.297178, 337 | 0.047469999999999998, 338 | 0.420491, 339 | 0.22745099999999999, 340 | 0.303568, 341 | 0.049396000000000002, 342 | 0.422182, 343 | 0.231373, 344 | 0.30993500000000002, 345 | 0.051407000000000001, 346 | 0.42372100000000001, 347 | 0.235294, 348 | 0.31628200000000001, 349 | 0.053490000000000003, 350 | 0.42511599999999999, 351 | 0.23921600000000001, 352 | 0.32261000000000001, 353 | 0.055634000000000003, 354 | 0.42637700000000001, 355 | 0.24313699999999999, 356 | 0.32892100000000002, 357 | 0.057827000000000003, 358 | 0.42751099999999997, 359 | 0.247059, 360 | 0.33521699999999999, 361 | 0.060060000000000002, 362 | 0.42852400000000002, 363 | 0.25097999999999998, 364 | 0.34150000000000003, 365 | 0.062324999999999998, 366 | 0.429425, 367 | 0.25490200000000002, 368 | 0.347771, 369 | 0.064616000000000007, 370 | 0.43021700000000002, 371 | 0.258824, 372 | 0.35403200000000001, 373 | 0.066924999999999998, 374 | 0.43090600000000001, 375 | 0.26274500000000001, 376 | 0.36028399999999999, 377 | 0.069247000000000003, 378 | 0.43149700000000002, 379 | 0.26666699999999999, 380 | 0.36652899999999999, 381 | 0.071579000000000004, 382 | 0.43199399999999999, 383 | 0.270588, 384 | 0.37276799999999999, 385 | 0.073914999999999995, 386 | 0.43240000000000001, 387 | 0.27450999999999998, 388 | 0.37900099999999998, 389 | 0.076253000000000001, 390 | 0.43271900000000002, 391 | 0.27843099999999998, 392 | 0.38522800000000001, 393 | 0.078590999999999994, 394 | 0.43295499999999998, 395 | 0.28235300000000002, 396 | 0.391453, 397 | 0.080926999999999999, 398 | 0.43310900000000002, 399 | 0.286275, 400 | 0.39767400000000003, 401 | 0.083256999999999998, 402 | 0.43318299999999998, 403 | 0.29019600000000001, 404 | 0.40389399999999998, 405 | 0.085580000000000003, 406 | 0.43317899999999998, 407 | 0.29411799999999999, 408 | 0.41011300000000001, 409 | 0.087896000000000002, 410 | 0.43309799999999998, 411 | 0.298039, 412 | 0.41633100000000001, 413 | 0.090203000000000005, 414 | 0.43294300000000002, 415 | 0.30196099999999998, 416 | 0.42254900000000001, 417 | 0.092501, 418 | 0.43271399999999999, 419 | 0.30588199999999999, 420 | 0.42876799999999998, 421 | 0.094789999999999999, 422 | 0.43241200000000002, 423 | 0.30980400000000002, 424 | 0.43498700000000001, 425 | 0.097069000000000003, 426 | 0.43203900000000001, 427 | 0.31372499999999998, 428 | 0.44120700000000002, 429 | 0.099337999999999996, 430 | 0.43159399999999998, 431 | 0.31764700000000001, 432 | 0.44742799999999999, 433 | 0.10159700000000001, 434 | 0.43108000000000002, 435 | 0.32156899999999999, 436 | 0.45365100000000003, 437 | 0.103848, 438 | 0.43049799999999999, 439 | 0.32549, 440 | 0.45987499999999998, 441 | 0.106089, 442 | 0.42984600000000001, 443 | 0.32941199999999998, 444 | 0.46610000000000001, 445 | 0.108322, 446 | 0.42912499999999998, 447 | 0.33333299999999999, 448 | 0.47232800000000003, 449 | 0.11054700000000001, 450 | 0.42833399999999999, 451 | 0.33725500000000003, 452 | 0.47855799999999998, 453 | 0.112764, 454 | 0.42747499999999999, 455 | 0.34117599999999998, 456 | 0.48478900000000003, 457 | 0.11497400000000001, 458 | 0.42654799999999998, 459 | 0.34509800000000002, 460 | 0.49102200000000001, 461 | 0.11717900000000001, 462 | 0.42555199999999999, 463 | 0.34902, 464 | 0.497257, 465 | 0.119379, 466 | 0.42448799999999998, 467 | 0.352941, 468 | 0.50349299999999997, 469 | 0.121575, 470 | 0.42335600000000001, 471 | 0.35686299999999999, 472 | 0.50973000000000002, 473 | 0.123769, 474 | 0.42215599999999998, 475 | 0.36078399999999999, 476 | 0.51596699999999995, 477 | 0.12595999999999999, 478 | 0.42088700000000001, 479 | 0.36470599999999997, 480 | 0.52220599999999995, 481 | 0.12814999999999999, 482 | 0.41954900000000001, 483 | 0.36862699999999998, 484 | 0.52844400000000002, 485 | 0.13034100000000001, 486 | 0.41814200000000001, 487 | 0.37254900000000002, 488 | 0.53468300000000002, 489 | 0.13253400000000001, 490 | 0.41666700000000001, 491 | 0.376471, 492 | 0.54091999999999996, 493 | 0.13472899999999999, 494 | 0.41512300000000002, 495 | 0.38039200000000001, 496 | 0.547157, 497 | 0.136929, 498 | 0.41351100000000002, 499 | 0.38431399999999999, 500 | 0.553392, 501 | 0.13913400000000001, 502 | 0.411829, 503 | 0.388235, 504 | 0.55962400000000001, 505 | 0.141346, 506 | 0.410078, 507 | 0.39215699999999998, 508 | 0.56585399999999997, 509 | 0.143567, 510 | 0.40825800000000001, 511 | 0.39607799999999999, 512 | 0.57208099999999995, 513 | 0.14579700000000001, 514 | 0.40636899999999998, 515 | 0.40000000000000002, 516 | 0.57830400000000004, 517 | 0.148039, 518 | 0.40441100000000002, 519 | 0.403922, 520 | 0.58452099999999996, 521 | 0.15029400000000001, 522 | 0.40238499999999999, 523 | 0.40784300000000001, 524 | 0.59073399999999998, 525 | 0.152563, 526 | 0.40028999999999998, 527 | 0.41176499999999999, 528 | 0.59694000000000003, 529 | 0.15484800000000001, 530 | 0.39812500000000001, 531 | 0.415686, 532 | 0.60313899999999998, 533 | 0.15715100000000001, 534 | 0.39589099999999999, 535 | 0.41960799999999998, 536 | 0.60933000000000004, 537 | 0.159474, 538 | 0.39358900000000002, 539 | 0.42352899999999999, 540 | 0.61551299999999998, 541 | 0.16181699999999999, 542 | 0.39121899999999998, 543 | 0.42745100000000003, 544 | 0.62168500000000004, 545 | 0.164184, 546 | 0.38878099999999999, 547 | 0.43137300000000001, 548 | 0.62784700000000004, 549 | 0.166575, 550 | 0.38627600000000001, 551 | 0.43529400000000001, 552 | 0.63399799999999995, 553 | 0.168992, 554 | 0.38370399999999999, 555 | 0.439216, 556 | 0.64013500000000001, 557 | 0.17143800000000001, 558 | 0.38106499999999999, 559 | 0.443137, 560 | 0.64625999999999995, 561 | 0.17391400000000001, 562 | 0.378359, 563 | 0.44705899999999998, 564 | 0.65236899999999998, 565 | 0.17642099999999999, 566 | 0.37558599999999998, 567 | 0.45097999999999999, 568 | 0.65846300000000002, 569 | 0.17896200000000001, 570 | 0.37274800000000002, 571 | 0.45490199999999997, 572 | 0.66454000000000002, 573 | 0.18153900000000001, 574 | 0.36984600000000001, 575 | 0.45882400000000001, 576 | 0.67059899999999995, 577 | 0.18415300000000001, 578 | 0.36687900000000001, 579 | 0.46274500000000002, 580 | 0.67663799999999996, 581 | 0.186807, 582 | 0.36384899999999998, 583 | 0.466667, 584 | 0.68265600000000004, 585 | 0.189501, 586 | 0.36075699999999999, 587 | 0.47058800000000001, 588 | 0.68865299999999996, 589 | 0.19223899999999999, 590 | 0.357603, 591 | 0.47450999999999999, 592 | 0.69462699999999999, 593 | 0.195021, 594 | 0.35438799999999998, 595 | 0.478431, 596 | 0.70057599999999998, 597 | 0.197851, 598 | 0.35111300000000001, 599 | 0.48235299999999998, 600 | 0.70650000000000002, 601 | 0.20072799999999999, 602 | 0.347777, 603 | 0.48627500000000001, 604 | 0.71239600000000003, 605 | 0.203656, 606 | 0.34438299999999999, 607 | 0.49019600000000002, 608 | 0.71826400000000001, 609 | 0.20663599999999999, 610 | 0.34093099999999998, 611 | 0.494118, 612 | 0.72410300000000005, 613 | 0.20967, 614 | 0.337424, 615 | 0.49803900000000001, 616 | 0.72990900000000003, 617 | 0.212759, 618 | 0.33386100000000002, 619 | 0.50196099999999999, 620 | 0.73568299999999998, 621 | 0.21590599999999999, 622 | 0.33024500000000001, 623 | 0.50588200000000005, 624 | 0.74142300000000005, 625 | 0.219112, 626 | 0.32657599999999998, 627 | 0.50980400000000003, 628 | 0.74712699999999999, 629 | 0.22237799999999999, 630 | 0.32285599999999998, 631 | 0.51372499999999999, 632 | 0.75279399999999996, 633 | 0.22570599999999999, 634 | 0.31908500000000001, 635 | 0.51764699999999997, 636 | 0.75842200000000004, 637 | 0.229097, 638 | 0.31526599999999999, 639 | 0.52156899999999995, 640 | 0.76400999999999997, 641 | 0.23255400000000001, 642 | 0.31139899999999998, 643 | 0.52549000000000001, 644 | 0.76955600000000002, 645 | 0.23607700000000001, 646 | 0.30748500000000001, 647 | 0.52941199999999999, 648 | 0.77505900000000005, 649 | 0.23966699999999999, 650 | 0.30352600000000002, 651 | 0.53333299999999995, 652 | 0.78051700000000002, 653 | 0.24332699999999999, 654 | 0.29952299999999998, 655 | 0.53725500000000004, 656 | 0.78592899999999999, 657 | 0.247056, 658 | 0.29547699999999999, 659 | 0.54117599999999999, 660 | 0.79129300000000002, 661 | 0.25085600000000002, 662 | 0.29138999999999998, 663 | 0.54509799999999997, 664 | 0.79660699999999995, 665 | 0.25472800000000001, 666 | 0.28726400000000002, 667 | 0.54901999999999995, 668 | 0.801871, 669 | 0.25867400000000002, 670 | 0.28309899999999999, 671 | 0.55294100000000002, 672 | 0.80708199999999997, 673 | 0.26269199999999998, 674 | 0.27889799999999998, 675 | 0.556863, 676 | 0.81223900000000004, 677 | 0.26678600000000002, 678 | 0.27466099999999999, 679 | 0.56078399999999995, 680 | 0.81734099999999998, 681 | 0.27095399999999997, 682 | 0.27039000000000002, 683 | 0.56470600000000004, 684 | 0.82238599999999995, 685 | 0.27519700000000002, 686 | 0.26608500000000002, 687 | 0.56862699999999999, 688 | 0.827372, 689 | 0.27951700000000002, 690 | 0.26174999999999998, 691 | 0.57254899999999997, 692 | 0.83229900000000001, 693 | 0.28391300000000003, 694 | 0.25738299999999997, 695 | 0.57647099999999996, 696 | 0.83716500000000005, 697 | 0.288385, 698 | 0.25298799999999999, 699 | 0.58039200000000002, 700 | 0.84196899999999997, 701 | 0.292933, 702 | 0.24856400000000001, 703 | 0.584314, 704 | 0.84670900000000004, 705 | 0.29755900000000002, 706 | 0.244113, 707 | 0.58823499999999995, 708 | 0.85138400000000003, 709 | 0.30225999999999997, 710 | 0.23963599999999999, 711 | 0.59215700000000004, 712 | 0.85599199999999998, 713 | 0.30703799999999998, 714 | 0.23513300000000001, 715 | 0.596078, 716 | 0.86053299999999999, 717 | 0.311892, 718 | 0.23060600000000001, 719 | 0.59999999999999998, 720 | 0.86500600000000005, 721 | 0.31682199999999999, 722 | 0.22605500000000001, 723 | 0.60392199999999996, 724 | 0.86940899999999999, 725 | 0.32182699999999997, 726 | 0.22148200000000001, 727 | 0.60784300000000002, 728 | 0.87374099999999999, 729 | 0.32690599999999997, 730 | 0.216886, 731 | 0.611765, 732 | 0.87800100000000003, 733 | 0.33206000000000002, 734 | 0.21226800000000001, 735 | 0.61568599999999996, 736 | 0.88218799999999997, 737 | 0.337287, 738 | 0.20762800000000001, 739 | 0.61960800000000005, 740 | 0.88630200000000003, 741 | 0.342586, 742 | 0.20296800000000001, 743 | 0.623529, 744 | 0.89034100000000005, 745 | 0.34795700000000002, 746 | 0.19828599999999999, 747 | 0.62745099999999998, 748 | 0.89430500000000002, 749 | 0.35339900000000002, 750 | 0.19358400000000001, 751 | 0.63137299999999996, 752 | 0.89819199999999999, 753 | 0.35891099999999998, 754 | 0.18886, 755 | 0.63529400000000003, 756 | 0.902003, 757 | 0.36449199999999998, 758 | 0.184116, 759 | 0.63921600000000001, 760 | 0.90573499999999996, 761 | 0.37014000000000002, 762 | 0.17935000000000001, 763 | 0.64313699999999996, 764 | 0.90939000000000003, 765 | 0.37585600000000002, 766 | 0.174563, 767 | 0.64705900000000005, 768 | 0.91296600000000006, 769 | 0.38163599999999998, 770 | 0.16975499999999999, 771 | 0.65098, 772 | 0.916462, 773 | 0.38748100000000002, 774 | 0.16492399999999999, 775 | 0.65490199999999998, 776 | 0.919879, 777 | 0.39338899999999999, 778 | 0.16006999999999999, 779 | 0.65882399999999997, 780 | 0.92321500000000001, 781 | 0.39935900000000002, 782 | 0.155193, 783 | 0.66274500000000003, 784 | 0.92647000000000002, 785 | 0.405389, 786 | 0.15029200000000001, 787 | 0.66666700000000001, 788 | 0.92964400000000003, 789 | 0.41147899999999998, 790 | 0.145367, 791 | 0.67058799999999996, 792 | 0.93273700000000004, 793 | 0.41762700000000003, 794 | 0.14041699999999999, 795 | 0.67451000000000005, 796 | 0.935747, 797 | 0.42383100000000001, 798 | 0.13544, 799 | 0.67843100000000001, 800 | 0.93867500000000004, 801 | 0.430091, 802 | 0.130438, 803 | 0.68235299999999999, 804 | 0.94152100000000005, 805 | 0.43640499999999999, 806 | 0.12540899999999999, 807 | 0.68627499999999997, 808 | 0.94428500000000004, 809 | 0.442772, 810 | 0.120354, 811 | 0.69019600000000003, 812 | 0.94696499999999995, 813 | 0.44919100000000001, 814 | 0.115272, 815 | 0.69411800000000001, 816 | 0.94956200000000002, 817 | 0.45566000000000001, 818 | 0.110164, 819 | 0.69803899999999997, 820 | 0.952075, 821 | 0.46217799999999998, 822 | 0.105031, 823 | 0.70196099999999995, 824 | 0.95450599999999997, 825 | 0.46874399999999999, 826 | 0.099874000000000004, 827 | 0.70588200000000001, 828 | 0.95685200000000004, 829 | 0.475356, 830 | 0.094695000000000001, 831 | 0.70980399999999999, 832 | 0.95911400000000002, 833 | 0.482014, 834 | 0.089498999999999995, 835 | 0.71372500000000005, 836 | 0.96129299999999995, 837 | 0.48871599999999998, 838 | 0.084289000000000003, 839 | 0.71764700000000003, 840 | 0.96338699999999999, 841 | 0.49546200000000001, 842 | 0.079073000000000004, 843 | 0.72156900000000002, 844 | 0.96539699999999995, 845 | 0.50224899999999995, 846 | 0.073858999999999994, 847 | 0.72548999999999997, 848 | 0.96732200000000002, 849 | 0.50907800000000003, 850 | 0.068658999999999998, 851 | 0.72941199999999995, 852 | 0.969163, 853 | 0.51594600000000002, 854 | 0.063488000000000003, 855 | 0.73333300000000001, 856 | 0.97091899999999998, 857 | 0.52285300000000001, 858 | 0.058367000000000002, 859 | 0.73725499999999999, 860 | 0.97258999999999995, 861 | 0.52979799999999999, 862 | 0.053324000000000003, 863 | 0.74117599999999995, 864 | 0.97417600000000004, 865 | 0.53678000000000003, 866 | 0.048391999999999998, 867 | 0.74509800000000004, 868 | 0.97567700000000002, 869 | 0.543798, 870 | 0.043617999999999997, 871 | 0.74902000000000002, 872 | 0.97709199999999996, 873 | 0.55084999999999995, 874 | 0.039050000000000001, 875 | 0.75294099999999997, 876 | 0.97842200000000001, 877 | 0.55793700000000002, 878 | 0.034930999999999997, 879 | 0.75686299999999995, 880 | 0.97966600000000004, 881 | 0.56505700000000003, 882 | 0.031408999999999999, 883 | 0.76078400000000002, 884 | 0.98082400000000003, 885 | 0.57220899999999997, 886 | 0.028507999999999999, 887 | 0.764706, 888 | 0.98189499999999996, 889 | 0.57939200000000002, 890 | 0.026249999999999999, 891 | 0.76862699999999995, 892 | 0.982881, 893 | 0.58660599999999996, 894 | 0.024660999999999999, 895 | 0.77254900000000004, 896 | 0.98377899999999996, 897 | 0.59384899999999996, 898 | 0.023769999999999999, 899 | 0.77647100000000002, 900 | 0.98459099999999999, 901 | 0.60112200000000005, 902 | 0.023605999999999999, 903 | 0.78039199999999997, 904 | 0.98531500000000005, 905 | 0.60842200000000002, 906 | 0.024202000000000001, 907 | 0.78431399999999996, 908 | 0.98595200000000005, 909 | 0.61575000000000002, 910 | 0.025592, 911 | 0.78823500000000002, 912 | 0.98650199999999999, 913 | 0.62310500000000002, 914 | 0.027813999999999998, 915 | 0.792157, 916 | 0.98696399999999995, 917 | 0.63048499999999996, 918 | 0.030908000000000001, 919 | 0.79607799999999995, 920 | 0.98733700000000002, 921 | 0.63788999999999996, 922 | 0.034916000000000003, 923 | 0.80000000000000004, 924 | 0.987622, 925 | 0.64532, 926 | 0.039885999999999998, 927 | 0.80392200000000003, 928 | 0.987819, 929 | 0.65277300000000005, 930 | 0.045581000000000003, 931 | 0.80784299999999998, 932 | 0.98792599999999997, 933 | 0.66025, 934 | 0.051749999999999997, 935 | 0.81176499999999996, 936 | 0.98794499999999996, 937 | 0.66774800000000001, 938 | 0.058328999999999999, 939 | 0.81568600000000002, 940 | 0.98787400000000003, 941 | 0.67526699999999995, 942 | 0.065256999999999996, 943 | 0.819608, 944 | 0.98771399999999998, 945 | 0.68280700000000005, 946 | 0.072488999999999998, 947 | 0.82352899999999996, 948 | 0.98746400000000001, 949 | 0.69036600000000004, 950 | 0.079990000000000006, 951 | 0.82745100000000005, 952 | 0.987124, 953 | 0.69794400000000001, 954 | 0.087731000000000003, 955 | 0.83137300000000003, 956 | 0.98669399999999996, 957 | 0.70553999999999994, 958 | 0.095694000000000001, 959 | 0.83529399999999998, 960 | 0.98617500000000002, 961 | 0.71315300000000004, 962 | 0.103863, 963 | 0.83921599999999996, 964 | 0.98556600000000005, 965 | 0.72078200000000003, 966 | 0.112229, 967 | 0.84313700000000003, 968 | 0.98486499999999999, 969 | 0.72842700000000005, 970 | 0.120785, 971 | 0.84705900000000001, 972 | 0.98407500000000003, 973 | 0.73608700000000005, 974 | 0.129527, 975 | 0.85097999999999996, 976 | 0.98319599999999996, 977 | 0.74375800000000003, 978 | 0.13845299999999999, 979 | 0.85490200000000005, 980 | 0.98222799999999999, 981 | 0.75144200000000005, 982 | 0.147565, 983 | 0.85882400000000003, 984 | 0.98117299999999996, 985 | 0.759135, 986 | 0.156863, 987 | 0.86274499999999998, 988 | 0.98003200000000001, 989 | 0.76683699999999999, 990 | 0.166353, 991 | 0.86666699999999997, 992 | 0.97880599999999995, 993 | 0.77454500000000004, 994 | 0.176037, 995 | 0.87058800000000003, 996 | 0.97749699999999995, 997 | 0.78225800000000001, 998 | 0.185923, 999 | 0.87451000000000001, 1000 | 0.97610799999999998, 1001 | 0.78997399999999995, 1002 | 0.196018, 1003 | 0.87843099999999996, 1004 | 0.974638, 1005 | 0.79769199999999996, 1006 | 0.20633199999999999, 1007 | 0.88235300000000005, 1008 | 0.97308799999999995, 1009 | 0.80540900000000004, 1010 | 0.21687699999999999, 1011 | 0.88627500000000003, 1012 | 0.971468, 1013 | 0.81312200000000001, 1014 | 0.227658, 1015 | 0.89019599999999999, 1016 | 0.96978299999999995, 1017 | 0.82082500000000003, 1018 | 0.23868600000000001, 1019 | 0.89411799999999997, 1020 | 0.96804100000000004, 1021 | 0.828515, 1022 | 0.249972, 1023 | 0.89803900000000003, 1024 | 0.96624299999999996, 1025 | 0.83619100000000002, 1026 | 0.26153399999999999, 1027 | 0.90196100000000001, 1028 | 0.96439399999999997, 1029 | 0.84384800000000004, 1030 | 0.273391, 1031 | 0.90588199999999997, 1032 | 0.96251699999999996, 1033 | 0.85147600000000001, 1034 | 0.28554600000000002, 1035 | 0.90980399999999995, 1036 | 0.96062599999999998, 1037 | 0.85906899999999997, 1038 | 0.29801, 1039 | 0.91372500000000001, 1040 | 0.95872000000000002, 1041 | 0.86662399999999995, 1042 | 0.31081999999999999, 1043 | 0.91764699999999999, 1044 | 0.95683399999999996, 1045 | 0.87412900000000004, 1046 | 0.32397399999999998, 1047 | 0.92156899999999997, 1048 | 0.95499699999999998, 1049 | 0.88156900000000005, 1050 | 0.33747500000000002, 1051 | 0.92549000000000003, 1052 | 0.95321500000000003, 1053 | 0.88894200000000001, 1054 | 0.35136899999999999, 1055 | 0.92941200000000002, 1056 | 0.951546, 1057 | 0.89622599999999997, 1058 | 0.36562699999999998, 1059 | 0.93333299999999997, 1060 | 0.95001800000000003, 1061 | 0.90340900000000002, 1062 | 0.38027100000000003, 1063 | 0.93725499999999995, 1064 | 0.94868300000000005, 1065 | 0.91047299999999998, 1066 | 0.395289, 1067 | 0.94117600000000001, 1068 | 0.94759400000000005, 1069 | 0.91739899999999996, 1070 | 0.410665, 1071 | 0.94509799999999999, 1072 | 0.94680900000000001, 1073 | 0.92416799999999999, 1074 | 0.426373, 1075 | 0.94901999999999997, 1076 | 0.94639200000000001, 1077 | 0.93076099999999995, 1078 | 0.44236700000000001, 1079 | 0.95294100000000004, 1080 | 0.94640299999999999, 1081 | 0.93715899999999996, 1082 | 0.458592, 1083 | 0.95686300000000002, 1084 | 0.94690300000000005, 1085 | 0.94334799999999996, 1086 | 0.47497, 1087 | 0.96078399999999997, 1088 | 0.94793700000000003, 1089 | 0.949318, 1090 | 0.49142599999999997, 1091 | 0.96470599999999995, 1092 | 0.94954499999999997, 1093 | 0.955063, 1094 | 0.50785999999999998, 1095 | 0.96862700000000002, 1096 | 0.95174000000000003, 1097 | 0.96058699999999997, 1098 | 0.52420299999999997, 1099 | 0.972549, 1100 | 0.95452899999999996, 1101 | 0.96589599999999998, 1102 | 0.54036099999999998, 1103 | 0.97647099999999998, 1104 | 0.95789599999999997, 1105 | 0.97100299999999995, 1106 | 0.55627499999999996, 1107 | 0.98039200000000004, 1108 | 0.961812, 1109 | 0.97592400000000001, 1110 | 0.57192500000000002, 1111 | 0.98431400000000002, 1112 | 0.96624900000000002, 1113 | 0.98067800000000005, 1114 | 0.58720600000000001, 1115 | 0.98823499999999997, 1116 | 0.97116199999999997, 1117 | 0.98528199999999999, 1118 | 0.60215399999999997, 1119 | 0.99215699999999996, 1120 | 0.97651100000000002, 1121 | 0.98975299999999999, 1122 | 0.61675999999999997, 1123 | 0.99607800000000002, 1124 | 0.98225700000000005, 1125 | 0.99410900000000002, 1126 | 0.63101700000000005, 1127 | 1.0, 1128 | 0.98836199999999996, 1129 | 0.99836400000000003, 1130 | 0.64492400000000005 1131 | ], 1132 | "Source" : "https://github.com/BIDS/colormap/blob/master/colormaps.py" 1133 | }, 1134 | { 1135 | "ColorSpace" : "Diverging", 1136 | "Creator" : "Eric Firing", 1137 | "DefaultMap" : true, 1138 | "License" : "CC0", 1139 | "Name" : "Viridis (matplotlib)", 1140 | "NanColor" : 1141 | [ 1142 | 1, 1143 | 0, 1144 | 0 1145 | ], 1146 | "RGBPoints" : 1147 | [ 1148 | 0.0, 1149 | 0.26700400000000002, 1150 | 0.0048739999999999999, 1151 | 0.32941500000000001, 1152 | 0.0039220000000000001, 1153 | 0.26851000000000003, 1154 | 0.0096050000000000007, 1155 | 0.33542699999999998, 1156 | 0.0078429999999999993, 1157 | 0.26994400000000002, 1158 | 0.014625000000000001, 1159 | 0.34137899999999999, 1160 | 0.011764999999999999, 1161 | 0.27130500000000002, 1162 | 0.019942000000000001, 1163 | 0.34726899999999999, 1164 | 0.015685999999999999, 1165 | 0.272594, 1166 | 0.025562999999999999, 1167 | 0.35309299999999999, 1168 | 0.019608, 1169 | 0.27380900000000002, 1170 | 0.031496999999999997, 1171 | 0.35885299999999998, 1172 | 0.023529000000000001, 1173 | 0.27495199999999997, 1174 | 0.037752000000000001, 1175 | 0.36454300000000001, 1176 | 0.027451, 1177 | 0.27602199999999999, 1178 | 0.044166999999999998, 1179 | 0.37016399999999999, 1180 | 0.031372999999999998, 1181 | 0.27701799999999999, 1182 | 0.050344, 1183 | 0.37571500000000002, 1184 | 0.035293999999999999, 1185 | 0.27794099999999999, 1186 | 0.056323999999999999, 1187 | 0.381191, 1188 | 0.039216000000000001, 1189 | 0.27879100000000001, 1190 | 0.062144999999999999, 1191 | 0.38659199999999999, 1192 | 0.043137000000000002, 1193 | 0.27956599999999998, 1194 | 0.067835999999999994, 1195 | 0.39191700000000002, 1196 | 0.047058999999999997, 1197 | 0.28026699999999999, 1198 | 0.073416999999999996, 1199 | 0.39716299999999999, 1200 | 0.050979999999999998, 1201 | 0.28089399999999998, 1202 | 0.078907000000000005, 1203 | 0.40232899999999999, 1204 | 0.054901999999999999, 1205 | 0.28144599999999997, 1206 | 0.084320000000000006, 1207 | 0.407414, 1208 | 0.058824000000000001, 1209 | 0.28192400000000001, 1210 | 0.089665999999999996, 1211 | 0.41241499999999998, 1212 | 0.062744999999999995, 1213 | 0.28232699999999999, 1214 | 0.094954999999999998, 1215 | 0.41733100000000001, 1216 | 0.066667000000000004, 1217 | 0.28265600000000002, 1218 | 0.10019599999999999, 1219 | 0.42215999999999998, 1220 | 0.070587999999999998, 1221 | 0.28290999999999999, 1222 | 0.105393, 1223 | 0.426902, 1224 | 0.074510000000000007, 1225 | 0.28309099999999998, 1226 | 0.110553, 1227 | 0.43155399999999999, 1228 | 0.078431000000000001, 1229 | 0.28319699999999998, 1230 | 0.11568000000000001, 1231 | 0.43611499999999997, 1232 | 0.082352999999999996, 1233 | 0.28322900000000001, 1234 | 0.120777, 1235 | 0.44058399999999998, 1236 | 0.086275000000000004, 1237 | 0.28318700000000002, 1238 | 0.12584799999999999, 1239 | 0.44496000000000002, 1240 | 0.090195999999999998, 1241 | 0.28307199999999999, 1242 | 0.13089500000000001, 1243 | 0.449241, 1244 | 0.094117999999999993, 1245 | 0.28288400000000002, 1246 | 0.13592000000000001, 1247 | 0.45342700000000002, 1248 | 0.098039000000000001, 1249 | 0.28262300000000001, 1250 | 0.140926, 1251 | 0.45751700000000001, 1252 | 0.101961, 1253 | 0.28228999999999999, 1254 | 0.14591199999999999, 1255 | 0.46150999999999998, 1256 | 0.105882, 1257 | 0.281887, 1258 | 0.15088099999999999, 1259 | 0.46540500000000001, 1260 | 0.109804, 1261 | 0.281412, 1262 | 0.155834, 1263 | 0.46920099999999998, 1264 | 0.11372500000000001, 1265 | 0.28086800000000001, 1266 | 0.160771, 1267 | 0.47289900000000001, 1268 | 0.117647, 1269 | 0.28025499999999998, 1270 | 0.16569300000000001, 1271 | 0.47649799999999998, 1272 | 0.121569, 1273 | 0.27957399999999999, 1274 | 0.170599, 1275 | 0.47999700000000001, 1276 | 0.12548999999999999, 1277 | 0.27882600000000002, 1278 | 0.17549000000000001, 1279 | 0.48339700000000002, 1280 | 0.129412, 1281 | 0.27801199999999998, 1282 | 0.180367, 1283 | 0.48669699999999999, 1284 | 0.13333300000000001, 1285 | 0.27713399999999999, 1286 | 0.185228, 1287 | 0.489898, 1288 | 0.13725499999999999, 1289 | 0.276194, 1290 | 0.19007399999999999, 1291 | 0.49300100000000002, 1292 | 0.141176, 1293 | 0.27519100000000002, 1294 | 0.19490499999999999, 1295 | 0.49600499999999997, 1296 | 0.145098, 1297 | 0.27412799999999998, 1298 | 0.19972100000000001, 1299 | 0.49891099999999999, 1300 | 0.14902000000000001, 1301 | 0.27300600000000003, 1302 | 0.20452000000000001, 1303 | 0.50172099999999997, 1304 | 0.15294099999999999, 1305 | 0.27182800000000001, 1306 | 0.20930299999999999, 1307 | 0.50443400000000005, 1308 | 0.156863, 1309 | 0.27059499999999997, 1310 | 0.21406900000000001, 1311 | 0.50705199999999995, 1312 | 0.16078400000000001, 1313 | 0.26930799999999999, 1314 | 0.21881800000000001, 1315 | 0.50957699999999995, 1316 | 0.16470599999999999, 1317 | 0.26796799999999998, 1318 | 0.223549, 1319 | 0.51200800000000002, 1320 | 0.168627, 1321 | 0.26657999999999998, 1322 | 0.22826199999999999, 1323 | 0.51434899999999995, 1324 | 0.17254900000000001, 1325 | 0.26514500000000002, 1326 | 0.232956, 1327 | 0.51659900000000003, 1328 | 0.17647099999999999, 1329 | 0.26366299999999998, 1330 | 0.23763100000000001, 1331 | 0.51876199999999995, 1332 | 0.180392, 1333 | 0.26213799999999998, 1334 | 0.242286, 1335 | 0.52083699999999999, 1336 | 0.18431400000000001, 1337 | 0.260571, 1338 | 0.246922, 1339 | 0.52282799999999996, 1340 | 0.18823500000000001, 1341 | 0.258965, 1342 | 0.25153700000000001, 1343 | 0.52473599999999998, 1344 | 0.19215699999999999, 1345 | 0.257322, 1346 | 0.25613000000000002, 1347 | 0.526563, 1348 | 0.196078, 1349 | 0.25564500000000001, 1350 | 0.26070300000000002, 1351 | 0.528312, 1352 | 0.20000000000000001, 1353 | 0.25393500000000002, 1354 | 0.26525399999999999, 1355 | 0.52998299999999998, 1356 | 0.20392199999999999, 1357 | 0.25219399999999997, 1358 | 0.269783, 1359 | 0.53157900000000002, 1360 | 0.207843, 1361 | 0.25042500000000001, 1362 | 0.27428999999999998, 1363 | 0.53310299999999999, 1364 | 0.21176500000000001, 1365 | 0.24862899999999999, 1366 | 0.278775, 1367 | 0.53455600000000003, 1368 | 0.21568599999999999, 1369 | 0.246811, 1370 | 0.28323700000000002, 1371 | 0.535941, 1372 | 0.219608, 1373 | 0.244972, 1374 | 0.28767500000000001, 1375 | 0.53725999999999996, 1376 | 0.22352900000000001, 1377 | 0.243113, 1378 | 0.29209200000000002, 1379 | 0.53851599999999999, 1380 | 0.22745099999999999, 1381 | 0.24123700000000001, 1382 | 0.296485, 1383 | 0.53970899999999999, 1384 | 0.231373, 1385 | 0.239346, 1386 | 0.30085499999999998, 1387 | 0.54084399999999999, 1388 | 0.235294, 1389 | 0.23744100000000001, 1390 | 0.30520199999999997, 1391 | 0.54192099999999999, 1392 | 0.23921600000000001, 1393 | 0.23552600000000001, 1394 | 0.309527, 1395 | 0.54294399999999998, 1396 | 0.24313699999999999, 1397 | 0.23360300000000001, 1398 | 0.313828, 1399 | 0.54391400000000001, 1400 | 0.247059, 1401 | 0.23167399999999999, 1402 | 0.318106, 1403 | 0.54483400000000004, 1404 | 0.25097999999999998, 1405 | 0.229739, 1406 | 0.32236100000000001, 1407 | 0.54570600000000002, 1408 | 0.25490200000000002, 1409 | 0.227802, 1410 | 0.326594, 1411 | 0.54653200000000002, 1412 | 0.258824, 1413 | 0.22586300000000001, 1414 | 0.33080500000000002, 1415 | 0.54731399999999997, 1416 | 0.26274500000000001, 1417 | 0.22392500000000001, 1418 | 0.33499400000000001, 1419 | 0.54805300000000001, 1420 | 0.26666699999999999, 1421 | 0.22198899999999999, 1422 | 0.33916099999999999, 1423 | 0.54875200000000002, 1424 | 0.270588, 1425 | 0.220057, 1426 | 0.34330699999999997, 1427 | 0.54941300000000004, 1428 | 0.27450999999999998, 1429 | 0.21812999999999999, 1430 | 0.34743200000000002, 1431 | 0.55003800000000003, 1432 | 0.27843099999999998, 1433 | 0.21621000000000001, 1434 | 0.35153499999999999, 1435 | 0.55062699999999998, 1436 | 0.28235300000000002, 1437 | 0.21429799999999999, 1438 | 0.35561900000000002, 1439 | 0.55118400000000001, 1440 | 0.286275, 1441 | 0.212395, 1442 | 0.35968299999999997, 1443 | 0.55171000000000003, 1444 | 0.29019600000000001, 1445 | 0.210503, 1446 | 0.36372700000000002, 1447 | 0.55220599999999997, 1448 | 0.29411799999999999, 1449 | 0.208623, 1450 | 0.36775200000000002, 1451 | 0.55267500000000003, 1452 | 0.298039, 1453 | 0.206756, 1454 | 0.37175799999999998, 1455 | 0.55311699999999997, 1456 | 0.30196099999999998, 1457 | 0.204903, 1458 | 0.37574600000000002, 1459 | 0.55353300000000005, 1460 | 0.30588199999999999, 1461 | 0.20306299999999999, 1462 | 0.379716, 1463 | 0.553925, 1464 | 0.30980400000000002, 1465 | 0.201239, 1466 | 0.38367000000000001, 1467 | 0.55429399999999995, 1468 | 0.31372499999999998, 1469 | 0.19943, 1470 | 0.38760699999999998, 1471 | 0.55464199999999997, 1472 | 0.31764700000000001, 1473 | 0.19763600000000001, 1474 | 0.39152799999999999, 1475 | 0.55496900000000005, 1476 | 0.32156899999999999, 1477 | 0.19586000000000001, 1478 | 0.39543299999999998, 1479 | 0.55527599999999999, 1480 | 0.32549, 1481 | 0.19409999999999999, 1482 | 0.39932299999999998, 1483 | 0.55556499999999998, 1484 | 0.32941199999999998, 1485 | 0.192357, 1486 | 0.40319899999999997, 1487 | 0.555836, 1488 | 0.33333299999999999, 1489 | 0.19063099999999999, 1490 | 0.40706100000000001, 1491 | 0.55608900000000006, 1492 | 0.33725500000000003, 1493 | 0.18892300000000001, 1494 | 0.41091, 1495 | 0.55632599999999999, 1496 | 0.34117599999999998, 1497 | 0.18723100000000001, 1498 | 0.414746, 1499 | 0.55654700000000001, 1500 | 0.34509800000000002, 1501 | 0.185556, 1502 | 0.41857, 1503 | 0.55675300000000005, 1504 | 0.34902, 1505 | 0.18389800000000001, 1506 | 0.42238300000000001, 1507 | 0.55694399999999999, 1508 | 0.352941, 1509 | 0.182256, 1510 | 0.42618400000000001, 1511 | 0.55711999999999995, 1512 | 0.35686299999999999, 1513 | 0.18062900000000001, 1514 | 0.429975, 1515 | 0.55728200000000006, 1516 | 0.36078399999999999, 1517 | 0.17901900000000001, 1518 | 0.43375599999999997, 1519 | 0.55742999999999998, 1520 | 0.36470599999999997, 1521 | 0.177423, 1522 | 0.437527, 1523 | 0.55756499999999998, 1524 | 0.36862699999999998, 1525 | 0.175841, 1526 | 0.44129000000000002, 1527 | 0.55768499999999999, 1528 | 0.37254900000000002, 1529 | 0.17427400000000001, 1530 | 0.445044, 1531 | 0.55779199999999995, 1532 | 0.376471, 1533 | 0.17271900000000001, 1534 | 0.448791, 1535 | 0.55788499999999996, 1536 | 0.38039200000000001, 1537 | 0.17117599999999999, 1538 | 0.45252999999999999, 1539 | 0.55796500000000004, 1540 | 0.38431399999999999, 1541 | 0.16964599999999999, 1542 | 0.456262, 1543 | 0.55803000000000003, 1544 | 0.388235, 1545 | 0.168126, 1546 | 0.45998800000000001, 1547 | 0.55808199999999997, 1548 | 0.39215699999999998, 1549 | 0.16661699999999999, 1550 | 0.46370800000000001, 1551 | 0.55811900000000003, 1552 | 0.39607799999999999, 1553 | 0.16511700000000001, 1554 | 0.46742299999999998, 1555 | 0.558141, 1556 | 0.40000000000000002, 1557 | 0.16362499999999999, 1558 | 0.47113300000000002, 1559 | 0.55814799999999998, 1560 | 0.403922, 1561 | 0.16214200000000001, 1562 | 0.47483799999999998, 1563 | 0.55813999999999997, 1564 | 0.40784300000000001, 1565 | 0.160665, 1566 | 0.47854000000000002, 1567 | 0.55811500000000003, 1568 | 0.41176499999999999, 1569 | 0.159194, 1570 | 0.48223700000000003, 1571 | 0.55807300000000004, 1572 | 0.415686, 1573 | 0.15772900000000001, 1574 | 0.48593199999999998, 1575 | 0.55801299999999998, 1576 | 0.41960799999999998, 1577 | 0.15626999999999999, 1578 | 0.489624, 1579 | 0.55793599999999999, 1580 | 0.42352899999999999, 1581 | 0.15481500000000001, 1582 | 0.493313, 1583 | 0.55784, 1584 | 0.42745100000000003, 1585 | 0.153364, 1586 | 0.497, 1587 | 0.557724, 1588 | 0.43137300000000001, 1589 | 0.151918, 1590 | 0.50068500000000005, 1591 | 0.55758700000000005, 1592 | 0.43529400000000001, 1593 | 0.150476, 1594 | 0.50436899999999996, 1595 | 0.55742999999999998, 1596 | 0.439216, 1597 | 0.149039, 1598 | 0.50805100000000003, 1599 | 0.55725000000000002, 1600 | 0.443137, 1601 | 0.14760699999999999, 1602 | 0.51173299999999999, 1603 | 0.55704900000000002, 1604 | 0.44705899999999998, 1605 | 0.14618, 1606 | 0.51541300000000001, 1607 | 0.55682299999999996, 1608 | 0.45097999999999999, 1609 | 0.144759, 1610 | 0.51909300000000003, 1611 | 0.55657199999999996, 1612 | 0.45490199999999997, 1613 | 0.143343, 1614 | 0.52277300000000004, 1615 | 0.55629499999999998, 1616 | 0.45882400000000001, 1617 | 0.14193500000000001, 1618 | 0.52645299999999995, 1619 | 0.55599100000000001, 1620 | 0.46274500000000002, 1621 | 0.14053599999999999, 1622 | 0.53013200000000005, 1623 | 0.55565900000000001, 1624 | 0.466667, 1625 | 0.13914699999999999, 1626 | 0.53381199999999995, 1627 | 0.55529799999999996, 1628 | 0.47058800000000001, 1629 | 0.13777, 1630 | 0.53749199999999997, 1631 | 0.55490600000000001, 1632 | 0.47450999999999999, 1633 | 0.136408, 1634 | 0.54117300000000002, 1635 | 0.55448299999999995, 1636 | 0.478431, 1637 | 0.13506599999999999, 1638 | 0.54485300000000003, 1639 | 0.55402899999999999, 1640 | 0.48235299999999998, 1641 | 0.133743, 1642 | 0.54853499999999999, 1643 | 0.55354099999999995, 1644 | 0.48627500000000001, 1645 | 0.13244400000000001, 1646 | 0.55221600000000004, 1647 | 0.55301800000000001, 1648 | 0.49019600000000002, 1649 | 0.13117200000000001, 1650 | 0.55589900000000003, 1651 | 0.55245900000000003, 1652 | 0.494118, 1653 | 0.12993299999999999, 1654 | 0.55958200000000002, 1655 | 0.55186400000000002, 1656 | 0.49803900000000001, 1657 | 0.12872900000000001, 1658 | 0.56326500000000002, 1659 | 0.55122899999999997, 1660 | 0.50196099999999999, 1661 | 0.12756799999999999, 1662 | 0.56694900000000004, 1663 | 0.55055600000000005, 1664 | 0.50588200000000005, 1665 | 0.12645300000000001, 1666 | 0.57063299999999995, 1667 | 0.54984100000000002, 1668 | 0.50980400000000003, 1669 | 0.12539400000000001, 1670 | 0.574318, 1671 | 0.54908599999999996, 1672 | 0.51372499999999999, 1673 | 0.12439500000000001, 1674 | 0.57800200000000002, 1675 | 0.54828699999999997, 1676 | 0.51764699999999997, 1677 | 0.123463, 1678 | 0.58168699999999995, 1679 | 0.54744499999999996, 1680 | 0.52156899999999995, 1681 | 0.12260600000000001, 1682 | 0.58537099999999997, 1683 | 0.54655699999999996, 1684 | 0.52549000000000001, 1685 | 0.12183099999999999, 1686 | 0.589055, 1687 | 0.54562299999999997, 1688 | 0.52941199999999999, 1689 | 0.12114800000000001, 1690 | 0.59273900000000002, 1691 | 0.54464100000000004, 1692 | 0.53333299999999995, 1693 | 0.12056500000000001, 1694 | 0.59642200000000001, 1695 | 0.54361099999999996, 1696 | 0.53725500000000004, 1697 | 0.120092, 1698 | 0.60010399999999997, 1699 | 0.54252999999999996, 1700 | 0.54117599999999999, 1701 | 0.119738, 1702 | 0.60378500000000002, 1703 | 0.54139999999999999, 1704 | 0.54509799999999997, 1705 | 0.11951199999999999, 1706 | 0.607464, 1707 | 0.54021799999999998, 1708 | 0.54901999999999995, 1709 | 0.119423, 1710 | 0.61114100000000005, 1711 | 0.53898199999999996, 1712 | 0.55294100000000002, 1713 | 0.11948300000000001, 1714 | 0.61481699999999995, 1715 | 0.53769199999999995, 1716 | 0.556863, 1717 | 0.119699, 1718 | 0.61848999999999998, 1719 | 0.53634700000000002, 1720 | 0.56078399999999995, 1721 | 0.12008099999999999, 1722 | 0.62216099999999996, 1723 | 0.53494600000000003, 1724 | 0.56470600000000004, 1725 | 0.120638, 1726 | 0.62582800000000005, 1727 | 0.53348799999999996, 1728 | 0.56862699999999999, 1729 | 0.12138, 1730 | 0.62949200000000005, 1731 | 0.53197300000000003, 1732 | 0.57254899999999997, 1733 | 0.122312, 1734 | 0.63315299999999997, 1735 | 0.53039800000000004, 1736 | 0.57647099999999996, 1737 | 0.123444, 1738 | 0.63680899999999996, 1739 | 0.52876299999999998, 1740 | 0.58039200000000002, 1741 | 0.12478, 1742 | 0.64046099999999995, 1743 | 0.52706799999999998, 1744 | 0.584314, 1745 | 0.12632599999999999, 1746 | 0.64410699999999999, 1747 | 0.52531099999999997, 1748 | 0.58823499999999995, 1749 | 0.12808700000000001, 1750 | 0.64774900000000002, 1751 | 0.52349100000000004, 1752 | 0.59215700000000004, 1753 | 0.13006699999999999, 1754 | 0.65138399999999996, 1755 | 0.52160799999999996, 1756 | 0.596078, 1757 | 0.132268, 1758 | 0.65501399999999999, 1759 | 0.51966100000000004, 1760 | 0.59999999999999998, 1761 | 0.13469200000000001, 1762 | 0.658636, 1763 | 0.51764900000000003, 1764 | 0.60392199999999996, 1765 | 0.13733899999999999, 1766 | 0.66225199999999995, 1767 | 0.515571, 1768 | 0.60784300000000002, 1769 | 0.14021, 1770 | 0.66585899999999998, 1771 | 0.51342699999999997, 1772 | 0.611765, 1773 | 0.14330300000000001, 1774 | 0.66945900000000003, 1775 | 0.51121499999999997, 1776 | 0.61568599999999996, 1777 | 0.146616, 1778 | 0.67305000000000004, 1779 | 0.50893600000000006, 1780 | 0.61960800000000005, 1781 | 0.150148, 1782 | 0.67663099999999998, 1783 | 0.50658899999999996, 1784 | 0.623529, 1785 | 0.153894, 1786 | 0.680203, 1787 | 0.50417199999999995, 1788 | 0.62745099999999998, 1789 | 0.15785099999999999, 1790 | 0.68376499999999996, 1791 | 0.50168599999999997, 1792 | 0.63137299999999996, 1793 | 0.16201599999999999, 1794 | 0.68731600000000004, 1795 | 0.49912899999999999, 1796 | 0.63529400000000003, 1797 | 0.166383, 1798 | 0.69085600000000003, 1799 | 0.496502, 1800 | 0.63921600000000001, 1801 | 0.17094799999999999, 1802 | 0.694384, 1803 | 0.49380299999999999, 1804 | 0.64313699999999996, 1805 | 0.175707, 1806 | 0.69789999999999996, 1807 | 0.491033, 1808 | 0.64705900000000005, 1809 | 0.18065300000000001, 1810 | 0.70140199999999997, 1811 | 0.48818899999999998, 1812 | 0.65098, 1813 | 0.185783, 1814 | 0.70489100000000005, 1815 | 0.48527300000000001, 1816 | 0.65490199999999998, 1817 | 0.19109000000000001, 1818 | 0.70836600000000005, 1819 | 0.48228399999999999, 1820 | 0.65882399999999997, 1821 | 0.196571, 1822 | 0.71182699999999999, 1823 | 0.47922100000000001, 1824 | 0.66274500000000003, 1825 | 0.20221900000000001, 1826 | 0.71527200000000002, 1827 | 0.47608400000000001, 1828 | 0.66666700000000001, 1829 | 0.20802999999999999, 1830 | 0.71870100000000003, 1831 | 0.47287299999999999, 1832 | 0.67058799999999996, 1833 | 0.214, 1834 | 0.72211400000000003, 1835 | 0.46958800000000001, 1836 | 0.67451000000000005, 1837 | 0.22012399999999999, 1838 | 0.72550899999999996, 1839 | 0.46622599999999997, 1840 | 0.67843100000000001, 1841 | 0.22639699999999999, 1842 | 0.72888799999999998, 1843 | 0.46278900000000001, 1844 | 0.68235299999999999, 1845 | 0.23281499999999999, 1846 | 0.73224699999999998, 1847 | 0.45927699999999999, 1848 | 0.68627499999999997, 1849 | 0.239374, 1850 | 0.73558800000000002, 1851 | 0.45568799999999998, 1852 | 0.69019600000000003, 1853 | 0.24607000000000001, 1854 | 0.73890999999999996, 1855 | 0.45202399999999998, 1856 | 0.69411800000000001, 1857 | 0.25289899999999998, 1858 | 0.74221099999999995, 1859 | 0.44828400000000002, 1860 | 0.69803899999999997, 1861 | 0.259857, 1862 | 0.74549200000000004, 1863 | 0.444467, 1864 | 0.70196099999999995, 1865 | 0.26694099999999998, 1866 | 0.74875100000000006, 1867 | 0.44057299999999999, 1868 | 0.70588200000000001, 1869 | 0.27414899999999998, 1870 | 0.75198799999999999, 1871 | 0.43660100000000002, 1872 | 0.70980399999999999, 1873 | 0.28147699999999998, 1874 | 0.75520299999999996, 1875 | 0.43255199999999999, 1876 | 0.71372500000000005, 1877 | 0.28892099999999998, 1878 | 0.75839400000000001, 1879 | 0.42842599999999997, 1880 | 0.71764700000000003, 1881 | 0.29647899999999999, 1882 | 0.76156100000000004, 1883 | 0.42422300000000002, 1884 | 0.72156900000000002, 1885 | 0.30414799999999997, 1886 | 0.76470400000000005, 1887 | 0.41994300000000001, 1888 | 0.72548999999999997, 1889 | 0.31192500000000001, 1890 | 0.767822, 1891 | 0.41558600000000001, 1892 | 0.72941199999999995, 1893 | 0.31980900000000001, 1894 | 0.77091399999999999, 1895 | 0.41115200000000002, 1896 | 0.73333300000000001, 1897 | 0.32779599999999998, 1898 | 0.77398, 1899 | 0.40664, 1900 | 0.73725499999999999, 1901 | 0.33588499999999999, 1902 | 0.77701799999999999, 1903 | 0.40204899999999999, 1904 | 0.74117599999999995, 1905 | 0.34407399999999999, 1906 | 0.78002899999999997, 1907 | 0.39738099999999998, 1908 | 0.74509800000000004, 1909 | 0.35236000000000001, 1910 | 0.78301100000000001, 1911 | 0.39263599999999999, 1912 | 0.74902000000000002, 1913 | 0.36074099999999998, 1914 | 0.785964, 1915 | 0.38781399999999999, 1916 | 0.75294099999999997, 1917 | 0.36921399999999999, 1918 | 0.78888800000000003, 1919 | 0.38291399999999998, 1920 | 0.75686299999999995, 1921 | 0.37777899999999998, 1922 | 0.79178099999999996, 1923 | 0.37793900000000002, 1924 | 0.76078400000000002, 1925 | 0.38643300000000003, 1926 | 0.79464400000000002, 1927 | 0.372886, 1928 | 0.764706, 1929 | 0.39517400000000003, 1930 | 0.79747500000000004, 1931 | 0.367757, 1932 | 0.76862699999999995, 1933 | 0.404001, 1934 | 0.80027499999999996, 1935 | 0.36255199999999999, 1936 | 0.77254900000000004, 1937 | 0.41291299999999997, 1938 | 0.803041, 1939 | 0.357269, 1940 | 0.77647100000000002, 1941 | 0.42190800000000001, 1942 | 0.80577399999999999, 1943 | 0.35191, 1944 | 0.78039199999999997, 1945 | 0.430983, 1946 | 0.808473, 1947 | 0.34647600000000001, 1948 | 0.78431399999999996, 1949 | 0.440137, 1950 | 0.81113800000000003, 1951 | 0.34096700000000002, 1952 | 0.78823500000000002, 1953 | 0.44936799999999999, 1954 | 0.81376800000000005, 1955 | 0.33538400000000002, 1956 | 0.792157, 1957 | 0.45867400000000003, 1958 | 0.81636299999999995, 1959 | 0.32972699999999999, 1960 | 0.79607799999999995, 1961 | 0.468053, 1962 | 0.81892100000000001, 1963 | 0.32399800000000001, 1964 | 0.80000000000000004, 1965 | 0.47750399999999998, 1966 | 0.82144399999999995, 1967 | 0.31819500000000001, 1968 | 0.80392200000000003, 1969 | 0.48702600000000001, 1970 | 0.82392900000000002, 1971 | 0.31232100000000002, 1972 | 0.80784299999999998, 1973 | 0.49661499999999997, 1974 | 0.826376, 1975 | 0.30637700000000001, 1976 | 0.81176499999999996, 1977 | 0.50627100000000003, 1978 | 0.82878600000000002, 1979 | 0.30036200000000002, 1980 | 0.81568600000000002, 1981 | 0.51599200000000001, 1982 | 0.83115799999999995, 1983 | 0.29427900000000001, 1984 | 0.819608, 1985 | 0.52577600000000002, 1986 | 0.83349099999999998, 1987 | 0.28812700000000002, 1988 | 0.82352899999999996, 1989 | 0.53562100000000001, 1990 | 0.835785, 1991 | 0.28190799999999999, 1992 | 0.82745100000000005, 1993 | 0.54552400000000001, 1994 | 0.83803899999999998, 1995 | 0.27562599999999998, 1996 | 0.83137300000000003, 1997 | 0.55548399999999998, 1998 | 0.84025399999999995, 1999 | 0.26928099999999999, 2000 | 0.83529399999999998, 2001 | 0.56549799999999995, 2002 | 0.84243000000000001, 2003 | 0.26287700000000003, 2004 | 0.83921599999999996, 2005 | 0.57556300000000005, 2006 | 0.84456600000000004, 2007 | 0.256415, 2008 | 0.84313700000000003, 2009 | 0.58567800000000003, 2010 | 0.846661, 2011 | 0.24989700000000001, 2012 | 0.84705900000000001, 2013 | 0.59583900000000001, 2014 | 0.84871700000000005, 2015 | 0.24332899999999999, 2016 | 0.85097999999999996, 2017 | 0.60604499999999994, 2018 | 0.85073299999999996, 2019 | 0.23671200000000001, 2020 | 0.85490200000000005, 2021 | 0.61629299999999998, 2022 | 0.85270900000000005, 2023 | 0.23005200000000001, 2024 | 0.85882400000000003, 2025 | 0.626579, 2026 | 0.85464499999999999, 2027 | 0.223353, 2028 | 0.86274499999999998, 2029 | 0.63690199999999997, 2030 | 0.85654200000000003, 2031 | 0.21662000000000001, 2032 | 0.86666699999999997, 2033 | 0.64725699999999997, 2034 | 0.85840000000000005, 2035 | 0.20986099999999999, 2036 | 0.87058800000000003, 2037 | 0.65764199999999995, 2038 | 0.86021899999999996, 2039 | 0.20308200000000001, 2040 | 0.87451000000000001, 2041 | 0.66805400000000004, 2042 | 0.86199899999999996, 2043 | 0.196293, 2044 | 0.87843099999999996, 2045 | 0.67848900000000001, 2046 | 0.86374200000000001, 2047 | 0.189503, 2048 | 0.88235300000000005, 2049 | 0.688944, 2050 | 0.865448, 2051 | 0.182725, 2052 | 0.88627500000000003, 2053 | 0.69941500000000001, 2054 | 0.86711700000000003, 2055 | 0.17597099999999999, 2056 | 0.89019599999999999, 2057 | 0.70989800000000003, 2058 | 0.86875100000000005, 2059 | 0.16925699999999999, 2060 | 0.89411799999999997, 2061 | 0.720391, 2062 | 0.87034999999999996, 2063 | 0.162603, 2064 | 0.89803900000000003, 2065 | 0.73088900000000001, 2066 | 0.87191600000000002, 2067 | 0.156029, 2068 | 0.90196100000000001, 2069 | 0.74138800000000005, 2070 | 0.87344900000000003, 2071 | 0.149561, 2072 | 0.90588199999999997, 2073 | 0.751884, 2074 | 0.87495100000000003, 2075 | 0.14322799999999999, 2076 | 0.90980399999999995, 2077 | 0.76237299999999997, 2078 | 0.87642399999999998, 2079 | 0.13706399999999999, 2080 | 0.91372500000000001, 2081 | 0.77285199999999998, 2082 | 0.87786799999999998, 2083 | 0.131109, 2084 | 0.91764699999999999, 2085 | 0.78331499999999998, 2086 | 0.87928499999999998, 2087 | 0.12540499999999999, 2088 | 0.92156899999999997, 2089 | 0.79376000000000002, 2090 | 0.88067799999999996, 2091 | 0.120005, 2092 | 0.92549000000000003, 2093 | 0.80418199999999995, 2094 | 0.882046, 2095 | 0.114965, 2096 | 0.92941200000000002, 2097 | 0.81457599999999997, 2098 | 0.88339299999999998, 2099 | 0.110347, 2100 | 0.93333299999999997, 2101 | 0.82494000000000001, 2102 | 0.88471999999999995, 2103 | 0.10621700000000001, 2104 | 0.93725499999999995, 2105 | 0.83526999999999996, 2106 | 0.88602899999999996, 2107 | 0.102646, 2108 | 0.94117600000000001, 2109 | 0.84556100000000001, 2110 | 0.88732200000000006, 2111 | 0.099701999999999999, 2112 | 0.94509799999999999, 2113 | 0.85580999999999996, 2114 | 0.88860099999999997, 2115 | 0.097451999999999997, 2116 | 0.94901999999999997, 2117 | 0.86601300000000003, 2118 | 0.88986799999999999, 2119 | 0.095952999999999997, 2120 | 0.95294100000000004, 2121 | 0.87616799999999995, 2122 | 0.89112499999999994, 2123 | 0.095250000000000001, 2124 | 0.95686300000000002, 2125 | 0.88627100000000003, 2126 | 0.892374, 2127 | 0.095374, 2128 | 0.96078399999999997, 2129 | 0.89632000000000001, 2130 | 0.89361599999999997, 2131 | 0.096335000000000004, 2132 | 0.96470599999999995, 2133 | 0.90631099999999998, 2134 | 0.89485499999999996, 2135 | 0.098125000000000004, 2136 | 0.96862700000000002, 2137 | 0.916242, 2138 | 0.89609099999999997, 2139 | 0.100717, 2140 | 0.972549, 2141 | 0.92610599999999998, 2142 | 0.89732999999999996, 2143 | 0.104071, 2144 | 0.97647099999999998, 2145 | 0.93590399999999996, 2146 | 0.89856999999999998, 2147 | 0.108131, 2148 | 0.98039200000000004, 2149 | 0.94563600000000003, 2150 | 0.89981500000000003, 2151 | 0.11283799999999999, 2152 | 0.98431400000000002, 2153 | 0.95530000000000004, 2154 | 0.901065, 2155 | 0.118128, 2156 | 0.98823499999999997, 2157 | 0.96489400000000003, 2158 | 0.90232299999999999, 2159 | 0.123941, 2160 | 0.99215699999999996, 2161 | 0.97441699999999998, 2162 | 0.90359, 2163 | 0.130215, 2164 | 0.99607800000000002, 2165 | 0.98386799999999996, 2166 | 0.90486699999999998, 2167 | 0.13689699999999999, 2168 | 1.0, 2169 | 0.99324800000000002, 2170 | 0.90615699999999999, 2171 | 0.14393600000000001 2172 | ], 2173 | "Source" : "https://github.com/BIDS/colormap/blob/master/colormaps.py" 2174 | }, 2175 | { 2176 | "ColorSpace" : "Diverging", 2177 | "Creator" : "Nathaniel J. Smith & Stefan van der Walt", 2178 | "License" : "CC0", 2179 | "Name" : "Magma (matplotlib)", 2180 | "NanColor" : 2181 | [ 2182 | 0, 2183 | 1, 2184 | 0 2185 | ], 2186 | "RGBPoints" : 2187 | [ 2188 | 0.0, 2189 | 0.001462, 2190 | 0.000466, 2191 | 0.013866, 2192 | 0.0039220000000000001, 2193 | 0.002258, 2194 | 0.0012949999999999999, 2195 | 0.018331, 2196 | 0.0078429999999999993, 2197 | 0.0032789999999999998, 2198 | 0.0023050000000000002, 2199 | 0.023708, 2200 | 0.011764999999999999, 2201 | 0.0045120000000000004, 2202 | 0.00349, 2203 | 0.029964999999999999, 2204 | 0.015685999999999999, 2205 | 0.0059500000000000004, 2206 | 0.0048430000000000001, 2207 | 0.037130000000000003, 2208 | 0.019608, 2209 | 0.0075880000000000001, 2210 | 0.0063559999999999997, 2211 | 0.044972999999999999, 2212 | 0.023529000000000001, 2213 | 0.0094260000000000004, 2214 | 0.0080219999999999996, 2215 | 0.052844000000000002, 2216 | 0.027451, 2217 | 0.011464999999999999, 2218 | 0.0098279999999999999, 2219 | 0.060749999999999998, 2220 | 0.031372999999999998, 2221 | 0.013708, 2222 | 0.011771, 2223 | 0.068667000000000006, 2224 | 0.035293999999999999, 2225 | 0.016156, 2226 | 0.01384, 2227 | 0.076603000000000004, 2228 | 0.039216000000000001, 2229 | 0.018814999999999998, 2230 | 0.016025999999999999, 2231 | 0.084584000000000006, 2232 | 0.043137000000000002, 2233 | 0.021691999999999999, 2234 | 0.018319999999999999, 2235 | 0.092609999999999998, 2236 | 0.047058999999999997, 2237 | 0.024792000000000002, 2238 | 0.020715000000000001, 2239 | 0.100676, 2240 | 0.050979999999999998, 2241 | 0.028122999999999999, 2242 | 0.023200999999999999, 2243 | 0.10878699999999999, 2244 | 0.054901999999999999, 2245 | 0.031696000000000002, 2246 | 0.025765, 2247 | 0.116965, 2248 | 0.058824000000000001, 2249 | 0.035520000000000003, 2250 | 0.028396999999999999, 2251 | 0.12520899999999999, 2252 | 0.062744999999999995, 2253 | 0.039607999999999997, 2254 | 0.03109, 2255 | 0.13351499999999999, 2256 | 0.066667000000000004, 2257 | 0.043830000000000001, 2258 | 0.033829999999999999, 2259 | 0.14188600000000001, 2260 | 0.070587999999999998, 2261 | 0.048062000000000001, 2262 | 0.036607000000000001, 2263 | 0.15032699999999999, 2264 | 0.074510000000000007, 2265 | 0.052319999999999998, 2266 | 0.039406999999999998, 2267 | 0.15884100000000001, 2268 | 0.078431000000000001, 2269 | 0.056614999999999999, 2270 | 0.042160000000000003, 2271 | 0.16744600000000001, 2272 | 0.082352999999999996, 2273 | 0.060949000000000003, 2274 | 0.044794, 2275 | 0.17612900000000001, 2276 | 0.086275000000000004, 2277 | 0.065329999999999999, 2278 | 0.047317999999999999, 2279 | 0.184892, 2280 | 0.090195999999999998, 2281 | 0.069764000000000007, 2282 | 0.049725999999999999, 2283 | 0.19373499999999999, 2284 | 0.094117999999999993, 2285 | 0.074257000000000004, 2286 | 0.052017000000000001, 2287 | 0.20266000000000001, 2288 | 0.098039000000000001, 2289 | 0.078814999999999996, 2290 | 0.054184000000000003, 2291 | 0.21166699999999999, 2292 | 0.101961, 2293 | 0.083446000000000006, 2294 | 0.056224999999999997, 2295 | 0.22075500000000001, 2296 | 0.105882, 2297 | 0.088154999999999997, 2298 | 0.058132999999999997, 2299 | 0.22992199999999999, 2300 | 0.109804, 2301 | 0.092949000000000004, 2302 | 0.059903999999999999, 2303 | 0.23916399999999999, 2304 | 0.11372500000000001, 2305 | 0.097833000000000003, 2306 | 0.061531000000000002, 2307 | 0.248477, 2308 | 0.117647, 2309 | 0.102815, 2310 | 0.063009999999999997, 2311 | 0.25785400000000003, 2312 | 0.121569, 2313 | 0.10789899999999999, 2314 | 0.064335000000000003, 2315 | 0.267289, 2316 | 0.12548999999999999, 2317 | 0.113094, 2318 | 0.065491999999999995, 2319 | 0.27678399999999997, 2320 | 0.129412, 2321 | 0.118405, 2322 | 0.066478999999999996, 2323 | 0.28632099999999999, 2324 | 0.13333300000000001, 2325 | 0.123833, 2326 | 0.067294999999999994, 2327 | 0.295879, 2328 | 0.13725499999999999, 2329 | 0.12938, 2330 | 0.067934999999999995, 2331 | 0.30544300000000002, 2332 | 0.141176, 2333 | 0.13505300000000001, 2334 | 0.068390999999999993, 2335 | 0.315, 2336 | 0.145098, 2337 | 0.14085800000000001, 2338 | 0.068654000000000007, 2339 | 0.32453799999999999, 2340 | 0.14902000000000001, 2341 | 0.146785, 2342 | 0.068737999999999994, 2343 | 0.334011, 2344 | 0.15294099999999999, 2345 | 0.152839, 2346 | 0.068637000000000004, 2347 | 0.34340399999999999, 2348 | 0.156863, 2349 | 0.15901799999999999, 2350 | 0.068353999999999998, 2351 | 0.352688, 2352 | 0.16078400000000001, 2353 | 0.16530800000000001, 2354 | 0.067910999999999999, 2355 | 0.36181600000000003, 2356 | 0.16470599999999999, 2357 | 0.171713, 2358 | 0.067305000000000004, 2359 | 0.37077100000000002, 2360 | 0.168627, 2361 | 0.17821200000000001, 2362 | 0.066575999999999996, 2363 | 0.37949699999999997, 2364 | 0.17254900000000001, 2365 | 0.18480099999999999, 2366 | 0.065731999999999999, 2367 | 0.38797300000000001, 2368 | 0.17647099999999999, 2369 | 0.19145999999999999, 2370 | 0.064818000000000001, 2371 | 0.396152, 2372 | 0.180392, 2373 | 0.19817699999999999, 2374 | 0.063862000000000002, 2375 | 0.40400900000000001, 2376 | 0.18431400000000001, 2377 | 0.20493500000000001, 2378 | 0.062907000000000005, 2379 | 0.41151399999999999, 2380 | 0.18823500000000001, 2381 | 0.21171799999999999, 2382 | 0.061991999999999998, 2383 | 0.41864699999999999, 2384 | 0.19215699999999999, 2385 | 0.21851200000000001, 2386 | 0.061157999999999997, 2387 | 0.42539199999999999, 2388 | 0.196078, 2389 | 0.225302, 2390 | 0.060444999999999999, 2391 | 0.43174200000000001, 2392 | 0.20000000000000001, 2393 | 0.23207700000000001, 2394 | 0.059888999999999998, 2395 | 0.437695, 2396 | 0.20392199999999999, 2397 | 0.23882600000000001, 2398 | 0.059517, 2399 | 0.44325599999999998, 2400 | 0.207843, 2401 | 0.24554300000000001, 2402 | 0.059352000000000002, 2403 | 0.448436, 2404 | 0.21176500000000001, 2405 | 0.25222, 2406 | 0.059415000000000003, 2407 | 0.45324799999999998, 2408 | 0.21568599999999999, 2409 | 0.258857, 2410 | 0.059706000000000002, 2411 | 0.45771000000000001, 2412 | 0.219608, 2413 | 0.26544699999999999, 2414 | 0.060236999999999999, 2415 | 0.46183999999999997, 2416 | 0.22352900000000001, 2417 | 0.27199400000000001, 2418 | 0.060994, 2419 | 0.46566000000000002, 2420 | 0.22745099999999999, 2421 | 0.27849299999999999, 2422 | 0.061977999999999998, 2423 | 0.46919, 2424 | 0.231373, 2425 | 0.28495100000000001, 2426 | 0.063168000000000002, 2427 | 0.47245100000000001, 2428 | 0.235294, 2429 | 0.29136600000000001, 2430 | 0.064552999999999999, 2431 | 0.475462, 2432 | 0.23921600000000001, 2433 | 0.29774, 2434 | 0.066116999999999995, 2435 | 0.47824299999999997, 2436 | 0.24313699999999999, 2437 | 0.30408099999999999, 2438 | 0.067835000000000006, 2439 | 0.48081200000000002, 2440 | 0.247059, 2441 | 0.31038199999999999, 2442 | 0.069702, 2443 | 0.483186, 2444 | 0.25097999999999998, 2445 | 0.31665399999999999, 2446 | 0.071690000000000004, 2447 | 0.48537999999999998, 2448 | 0.25490200000000002, 2449 | 0.32289899999999999, 2450 | 0.073782, 2451 | 0.48740800000000001, 2452 | 0.258824, 2453 | 0.32911400000000002, 2454 | 0.075971999999999998, 2455 | 0.48928700000000003, 2456 | 0.26274500000000001, 2457 | 0.33530799999999999, 2458 | 0.078236, 2459 | 0.49102400000000002, 2460 | 0.26666699999999999, 2461 | 0.34148200000000001, 2462 | 0.080563999999999997, 2463 | 0.49263099999999999, 2464 | 0.270588, 2465 | 0.347636, 2466 | 0.082946000000000006, 2467 | 0.49412099999999998, 2468 | 0.27450999999999998, 2469 | 0.353773, 2470 | 0.085373000000000004, 2471 | 0.49550100000000002, 2472 | 0.27843099999999998, 2473 | 0.359898, 2474 | 0.087831000000000006, 2475 | 0.496778, 2476 | 0.28235300000000002, 2477 | 0.366012, 2478 | 0.090314000000000005, 2479 | 0.49796000000000001, 2480 | 0.286275, 2481 | 0.372116, 2482 | 0.092815999999999996, 2483 | 0.49905300000000002, 2484 | 0.29019600000000001, 2485 | 0.37821100000000002, 2486 | 0.095332, 2487 | 0.50006700000000004, 2488 | 0.29411799999999999, 2489 | 0.384299, 2490 | 0.097854999999999998, 2491 | 0.50100199999999995, 2492 | 0.298039, 2493 | 0.39038400000000001, 2494 | 0.100379, 2495 | 0.50186399999999998, 2496 | 0.30196099999999998, 2497 | 0.39646700000000001, 2498 | 0.10290199999999999, 2499 | 0.50265800000000005, 2500 | 0.30588199999999999, 2501 | 0.40254800000000002, 2502 | 0.10542, 2503 | 0.503386, 2504 | 0.30980400000000002, 2505 | 0.40862900000000002, 2506 | 0.10793, 2507 | 0.50405199999999994, 2508 | 0.31372499999999998, 2509 | 0.41470899999999999, 2510 | 0.110431, 2511 | 0.50466200000000005, 2512 | 0.31764700000000001, 2513 | 0.42079100000000003, 2514 | 0.11292000000000001, 2515 | 0.50521499999999997, 2516 | 0.32156899999999999, 2517 | 0.42687700000000001, 2518 | 0.115395, 2519 | 0.505714, 2520 | 0.32549, 2521 | 0.43296699999999999, 2522 | 0.117855, 2523 | 0.50616000000000005, 2524 | 0.32941199999999998, 2525 | 0.43906200000000001, 2526 | 0.120298, 2527 | 0.50655499999999998, 2528 | 0.33333299999999999, 2529 | 0.44516299999999998, 2530 | 0.122724, 2531 | 0.50690100000000005, 2532 | 0.33725500000000003, 2533 | 0.45127099999999998, 2534 | 0.12513199999999999, 2535 | 0.50719800000000004, 2536 | 0.34117599999999998, 2537 | 0.45738600000000001, 2538 | 0.127522, 2539 | 0.50744800000000001, 2540 | 0.34509800000000002, 2541 | 0.46350799999999998, 2542 | 0.12989300000000001, 2543 | 0.50765199999999999, 2544 | 0.34902, 2545 | 0.46964, 2546 | 0.132245, 2547 | 0.50780899999999995, 2548 | 0.352941, 2549 | 0.47577999999999998, 2550 | 0.134577, 2551 | 0.50792099999999996, 2552 | 0.35686299999999999, 2553 | 0.481929, 2554 | 0.13689100000000001, 2555 | 0.50798900000000002, 2556 | 0.36078399999999999, 2557 | 0.48808800000000002, 2558 | 0.139186, 2559 | 0.50801099999999999, 2560 | 0.36470599999999997, 2561 | 0.49425799999999998, 2562 | 0.141462, 2563 | 0.507988, 2564 | 0.36862699999999998, 2565 | 0.50043800000000005, 2566 | 0.14371900000000001, 2567 | 0.50792000000000004, 2568 | 0.37254900000000002, 2569 | 0.506629, 2570 | 0.145958, 2571 | 0.50780599999999998, 2572 | 0.376471, 2573 | 0.51283100000000004, 2574 | 0.14817900000000001, 2575 | 0.50764799999999999, 2576 | 0.38039200000000001, 2577 | 0.51904499999999998, 2578 | 0.15038299999999999, 2579 | 0.50744299999999998, 2580 | 0.38431399999999999, 2581 | 0.52527000000000001, 2582 | 0.15256900000000001, 2583 | 0.50719199999999998, 2584 | 0.388235, 2585 | 0.53150699999999995, 2586 | 0.15473899999999999, 2587 | 0.50689499999999998, 2588 | 0.39215699999999998, 2589 | 0.53775499999999998, 2590 | 0.15689400000000001, 2591 | 0.50655099999999997, 2592 | 0.39607799999999999, 2593 | 0.54401500000000003, 2594 | 0.15903300000000001, 2595 | 0.50615900000000003, 2596 | 0.40000000000000002, 2597 | 0.55028699999999997, 2598 | 0.161158, 2599 | 0.50571900000000003, 2600 | 0.403922, 2601 | 0.55657100000000004, 2602 | 0.163269, 2603 | 0.50522999999999996, 2604 | 0.40784300000000001, 2605 | 0.56286599999999998, 2606 | 0.16536799999999999, 2607 | 0.50469200000000003, 2608 | 0.41176499999999999, 2609 | 0.56917200000000001, 2610 | 0.16745399999999999, 2611 | 0.50410500000000003, 2612 | 0.415686, 2613 | 0.57548999999999995, 2614 | 0.16952999999999999, 2615 | 0.50346599999999997, 2616 | 0.41960799999999998, 2617 | 0.58181899999999998, 2618 | 0.171596, 2619 | 0.50277700000000003, 2620 | 0.42352899999999999, 2621 | 0.58815799999999996, 2622 | 0.173652, 2623 | 0.50203500000000001, 2624 | 0.42745100000000003, 2625 | 0.59450800000000004, 2626 | 0.175701, 2627 | 0.50124100000000005, 2628 | 0.43137300000000001, 2629 | 0.60086799999999996, 2630 | 0.17774300000000001, 2631 | 0.50039400000000001, 2632 | 0.43529400000000001, 2633 | 0.60723800000000006, 2634 | 0.17977899999999999, 2635 | 0.49949199999999999, 2636 | 0.439216, 2637 | 0.61361699999999997, 2638 | 0.181811, 2639 | 0.49853599999999998, 2640 | 0.443137, 2641 | 0.62000500000000003, 2642 | 0.18384, 2643 | 0.49752400000000002, 2644 | 0.44705899999999998, 2645 | 0.62640099999999999, 2646 | 0.185867, 2647 | 0.49645600000000001, 2648 | 0.45097999999999999, 2649 | 0.63280499999999995, 2650 | 0.187893, 2651 | 0.49533199999999999, 2652 | 0.45490199999999997, 2653 | 0.63921600000000001, 2654 | 0.18992100000000001, 2655 | 0.49414999999999998, 2656 | 0.45882400000000001, 2657 | 0.64563300000000001, 2658 | 0.19195200000000001, 2659 | 0.49291000000000001, 2660 | 0.46274500000000002, 2661 | 0.65205599999999997, 2662 | 0.19398599999999999, 2663 | 0.49161100000000002, 2664 | 0.466667, 2665 | 0.65848300000000004, 2666 | 0.19602700000000001, 2667 | 0.49025299999999999, 2668 | 0.47058800000000001, 2669 | 0.66491500000000003, 2670 | 0.198075, 2671 | 0.48883599999999999, 2672 | 0.47450999999999999, 2673 | 0.67134899999999997, 2674 | 0.20013300000000001, 2675 | 0.48735800000000001, 2676 | 0.478431, 2677 | 0.677786, 2678 | 0.20220299999999999, 2679 | 0.485819, 2680 | 0.48235299999999998, 2681 | 0.68422400000000005, 2682 | 0.204286, 2683 | 0.48421900000000001, 2684 | 0.48627500000000001, 2685 | 0.69066099999999997, 2686 | 0.20638400000000001, 2687 | 0.48255799999999999, 2688 | 0.49019600000000002, 2689 | 0.697098, 2690 | 0.20850099999999999, 2691 | 0.48083500000000001, 2692 | 0.494118, 2693 | 0.70353200000000005, 2694 | 0.21063799999999999, 2695 | 0.479049, 2696 | 0.49803900000000001, 2697 | 0.70996199999999998, 2698 | 0.21279699999999999, 2699 | 0.47720099999999999, 2700 | 0.50196099999999999, 2701 | 0.716387, 2702 | 0.21498200000000001, 2703 | 0.47528999999999999, 2704 | 0.50588200000000005, 2705 | 0.72280500000000003, 2706 | 0.217194, 2707 | 0.47331600000000001, 2708 | 0.50980400000000003, 2709 | 0.72921599999999998, 2710 | 0.21943699999999999, 2711 | 0.471279, 2712 | 0.51372499999999999, 2713 | 0.73561600000000005, 2714 | 0.22171299999999999, 2715 | 0.46917999999999999, 2716 | 0.51764699999999997, 2717 | 0.742004, 2718 | 0.224025, 2719 | 0.46701799999999999, 2720 | 0.52156899999999995, 2721 | 0.74837799999999999, 2722 | 0.22637699999999999, 2723 | 0.46479399999999998, 2724 | 0.52549000000000001, 2725 | 0.75473699999999999, 2726 | 0.228772, 2727 | 0.462509, 2728 | 0.52941199999999999, 2729 | 0.761077, 2730 | 0.231214, 2731 | 0.46016200000000002, 2732 | 0.53333299999999995, 2733 | 0.76739800000000002, 2734 | 0.233705, 2735 | 0.45775500000000002, 2736 | 0.53725500000000004, 2737 | 0.77369500000000002, 2738 | 0.23624899999999999, 2739 | 0.455289, 2740 | 0.54117599999999999, 2741 | 0.77996799999999999, 2742 | 0.23885100000000001, 2743 | 0.45276499999999997, 2744 | 0.54509799999999997, 2745 | 0.78621200000000002, 2746 | 0.24151400000000001, 2747 | 0.45018399999999997, 2748 | 0.54901999999999995, 2749 | 0.79242699999999999, 2750 | 0.24424199999999999, 2751 | 0.44754300000000002, 2752 | 0.55294100000000002, 2753 | 0.79860799999999998, 2754 | 0.24704000000000001, 2755 | 0.44484800000000002, 2756 | 0.556863, 2757 | 0.80475200000000002, 2758 | 0.24991099999999999, 2759 | 0.44210199999999999, 2760 | 0.56078399999999995, 2761 | 0.81085499999999999, 2762 | 0.252861, 2763 | 0.439305, 2764 | 0.56470600000000004, 2765 | 0.81691400000000003, 2766 | 0.25589499999999998, 2767 | 0.43646099999999999, 2768 | 0.56862699999999999, 2769 | 0.82292600000000005, 2770 | 0.25901600000000002, 2771 | 0.43357299999999999, 2772 | 0.57254899999999997, 2773 | 0.82888600000000001, 2774 | 0.26222899999999999, 2775 | 0.43064400000000003, 2776 | 0.57647099999999996, 2777 | 0.83479099999999995, 2778 | 0.26554, 2779 | 0.42767100000000002, 2780 | 0.58039200000000002, 2781 | 0.84063600000000005, 2782 | 0.268953, 2783 | 0.42466599999999999, 2784 | 0.584314, 2785 | 0.84641599999999995, 2786 | 0.27247300000000002, 2787 | 0.42163099999999998, 2788 | 0.58823499999999995, 2789 | 0.85212600000000005, 2790 | 0.27610600000000002, 2791 | 0.41857299999999997, 2792 | 0.59215700000000004, 2793 | 0.85776300000000005, 2794 | 0.27985700000000002, 2795 | 0.41549599999999998, 2796 | 0.596078, 2797 | 0.86331999999999998, 2798 | 0.28372900000000001, 2799 | 0.41240300000000002, 2800 | 0.59999999999999998, 2801 | 0.86879300000000004, 2802 | 0.28772799999999998, 2803 | 0.40930299999999997, 2804 | 0.60392199999999996, 2805 | 0.87417599999999995, 2806 | 0.29185899999999998, 2807 | 0.40620499999999998, 2808 | 0.60784300000000002, 2809 | 0.87946400000000002, 2810 | 0.29612500000000003, 2811 | 0.40311799999999998, 2812 | 0.611765, 2813 | 0.88465099999999997, 2814 | 0.30053000000000002, 2815 | 0.40004699999999999, 2816 | 0.61568599999999996, 2817 | 0.88973100000000005, 2818 | 0.30507899999999999, 2819 | 0.39700200000000002, 2820 | 0.61960800000000005, 2821 | 0.89470000000000005, 2822 | 0.30977300000000002, 2823 | 0.39399499999999998, 2824 | 0.623529, 2825 | 0.89955200000000002, 2826 | 0.31461600000000001, 2827 | 0.39103700000000002, 2828 | 0.62745099999999998, 2829 | 0.904281, 2830 | 0.31961000000000001, 2831 | 0.38813700000000001, 2832 | 0.63137299999999996, 2833 | 0.90888400000000003, 2834 | 0.32475500000000002, 2835 | 0.38530799999999998, 2836 | 0.63529400000000003, 2837 | 0.913354, 2838 | 0.33005200000000001, 2839 | 0.38256299999999999, 2840 | 0.63921600000000001, 2841 | 0.91768899999999998, 2842 | 0.33550000000000002, 2843 | 0.379915, 2844 | 0.64313699999999996, 2845 | 0.92188400000000004, 2846 | 0.34109800000000001, 2847 | 0.37737599999999999, 2848 | 0.64705900000000005, 2849 | 0.92593700000000001, 2850 | 0.34684399999999999, 2851 | 0.37495899999999999, 2852 | 0.65098, 2853 | 0.92984500000000003, 2854 | 0.35273399999999999, 2855 | 0.37267699999999998, 2856 | 0.65490199999999998, 2857 | 0.93360600000000005, 2858 | 0.35876400000000003, 2859 | 0.37054100000000001, 2860 | 0.65882399999999997, 2861 | 0.93722099999999997, 2862 | 0.364929, 2863 | 0.36856699999999998, 2864 | 0.66274500000000003, 2865 | 0.94068700000000005, 2866 | 0.371224, 2867 | 0.36676199999999998, 2868 | 0.66666700000000001, 2869 | 0.94400600000000001, 2870 | 0.37764300000000001, 2871 | 0.36513600000000002, 2872 | 0.67058799999999996, 2873 | 0.94718000000000002, 2874 | 0.38417800000000002, 2875 | 0.363701, 2876 | 0.67451000000000005, 2877 | 0.95021, 2878 | 0.39082, 2879 | 0.36246800000000001, 2880 | 0.67843100000000001, 2881 | 0.95309900000000003, 2882 | 0.397563, 2883 | 0.36143799999999998, 2884 | 0.68235299999999999, 2885 | 0.95584899999999995, 2886 | 0.40439999999999998, 2887 | 0.36061900000000002, 2888 | 0.68627499999999997, 2889 | 0.95846399999999998, 2890 | 0.41132400000000002, 2891 | 0.360014, 2892 | 0.69019600000000003, 2893 | 0.96094900000000005, 2894 | 0.418323, 2895 | 0.35963000000000001, 2896 | 0.69411800000000001, 2897 | 0.96331, 2898 | 0.42538999999999999, 2899 | 0.35946899999999998, 2900 | 0.69803899999999997, 2901 | 0.96554899999999999, 2902 | 0.43251899999999999, 2903 | 0.35952899999999999, 2904 | 0.70196099999999995, 2905 | 0.96767099999999995, 2906 | 0.43970300000000001, 2907 | 0.35981000000000002, 2908 | 0.70588200000000001, 2909 | 0.96967999999999999, 2910 | 0.446936, 2911 | 0.36031099999999999, 2912 | 0.70980399999999999, 2913 | 0.97158199999999995, 2914 | 0.45421, 2915 | 0.36103000000000002, 2916 | 0.71372500000000005, 2917 | 0.97338100000000005, 2918 | 0.46151999999999999, 2919 | 0.36196499999999998, 2920 | 0.71764700000000003, 2921 | 0.975082, 2922 | 0.46886100000000003, 2923 | 0.36311100000000002, 2924 | 0.72156900000000002, 2925 | 0.97668999999999995, 2926 | 0.47622599999999998, 2927 | 0.36446600000000001, 2928 | 0.72548999999999997, 2929 | 0.97821000000000002, 2930 | 0.48361199999999999, 2931 | 0.36602499999999999, 2932 | 0.72941199999999995, 2933 | 0.97964499999999999, 2934 | 0.49101400000000001, 2935 | 0.36778300000000003, 2936 | 0.73333300000000001, 2937 | 0.98099999999999998, 2938 | 0.49842799999999998, 2939 | 0.36973400000000001, 2940 | 0.73725499999999999, 2941 | 0.98227900000000001, 2942 | 0.50585100000000005, 2943 | 0.37187399999999998, 2944 | 0.74117599999999995, 2945 | 0.98348500000000005, 2946 | 0.51327999999999996, 2947 | 0.37419799999999998, 2948 | 0.74509800000000004, 2949 | 0.984622, 2950 | 0.52071299999999998, 2951 | 0.37669799999999998, 2952 | 0.74902000000000002, 2953 | 0.98569300000000004, 2954 | 0.52814799999999995, 2955 | 0.37937100000000001, 2956 | 0.75294099999999997, 2957 | 0.98670000000000002, 2958 | 0.535582, 2959 | 0.38220999999999999, 2960 | 0.75686299999999995, 2961 | 0.98764600000000002, 2962 | 0.54301500000000003, 2963 | 0.38521, 2964 | 0.76078400000000002, 2965 | 0.988533, 2966 | 0.55044599999999999, 2967 | 0.38836500000000002, 2968 | 0.764706, 2969 | 0.98936299999999999, 2970 | 0.55787299999999995, 2971 | 0.39167099999999999, 2972 | 0.76862699999999995, 2973 | 0.99013799999999996, 2974 | 0.56529600000000002, 2975 | 0.39512199999999997, 2976 | 0.77254900000000004, 2977 | 0.99087099999999995, 2978 | 0.57270600000000005, 2979 | 0.39871400000000001, 2980 | 0.77647100000000002, 2981 | 0.99155800000000005, 2982 | 0.58010700000000004, 2983 | 0.40244099999999999, 2984 | 0.78039199999999997, 2985 | 0.99219599999999997, 2986 | 0.58750199999999997, 2987 | 0.40629900000000002, 2988 | 0.78431399999999996, 2989 | 0.99278500000000003, 2990 | 0.59489099999999995, 2991 | 0.41028300000000001, 2992 | 0.78823500000000002, 2993 | 0.99332600000000004, 2994 | 0.602275, 2995 | 0.41438999999999998, 2996 | 0.792157, 2997 | 0.993834, 2998 | 0.60964399999999996, 2999 | 0.41861300000000001, 3000 | 0.79607799999999995, 3001 | 0.994309, 3002 | 0.61699899999999996, 3003 | 0.42294999999999999, 3004 | 0.80000000000000004, 3005 | 0.99473800000000001, 3006 | 0.62434999999999996, 3007 | 0.42739700000000003, 3008 | 0.80392200000000003, 3009 | 0.99512199999999995, 3010 | 0.63169600000000004, 3011 | 0.43195099999999997, 3012 | 0.80784299999999998, 3013 | 0.99548000000000003, 3014 | 0.63902700000000001, 3015 | 0.43660700000000002, 3016 | 0.81176499999999996, 3017 | 0.99580999999999997, 3018 | 0.64634400000000003, 3019 | 0.441361, 3020 | 0.81568600000000002, 3021 | 0.99609599999999998, 3022 | 0.65365899999999999, 3023 | 0.44621300000000003, 3024 | 0.819608, 3025 | 0.99634100000000003, 3026 | 0.66096900000000003, 3027 | 0.45116000000000001, 3028 | 0.82352899999999996, 3029 | 0.99658000000000002, 3030 | 0.66825599999999996, 3031 | 0.45619199999999999, 3032 | 0.82745100000000005, 3033 | 0.99677499999999997, 3034 | 0.67554099999999995, 3035 | 0.461314, 3036 | 0.83137300000000003, 3037 | 0.99692499999999995, 3038 | 0.68282799999999999, 3039 | 0.466526, 3040 | 0.83529399999999998, 3041 | 0.99707699999999999, 3042 | 0.69008800000000003, 3043 | 0.47181099999999998, 3044 | 0.83921599999999996, 3045 | 0.99718600000000002, 3046 | 0.697349, 3047 | 0.477182, 3048 | 0.84313700000000003, 3049 | 0.99725399999999997, 3050 | 0.70461099999999999, 3051 | 0.48263499999999998, 3052 | 0.84705900000000001, 3053 | 0.99732500000000002, 3054 | 0.71184800000000004, 3055 | 0.48815399999999998, 3056 | 0.85097999999999996, 3057 | 0.99735099999999999, 3058 | 0.71908899999999998, 3059 | 0.493755, 3060 | 0.85490200000000005, 3061 | 0.99735099999999999, 3062 | 0.72632399999999997, 3063 | 0.49942799999999998, 3064 | 0.85882400000000003, 3065 | 0.99734100000000003, 3066 | 0.733545, 3067 | 0.50516700000000003, 3068 | 0.86274499999999998, 3069 | 0.99728499999999998, 3070 | 0.74077199999999999, 3071 | 0.51098299999999997, 3072 | 0.86666699999999997, 3073 | 0.997228, 3074 | 0.74798100000000001, 3075 | 0.51685899999999996, 3076 | 0.87058800000000003, 3077 | 0.99713799999999997, 3078 | 0.75519000000000003, 3079 | 0.52280599999999999, 3080 | 0.87451000000000001, 3081 | 0.99701899999999999, 3082 | 0.76239800000000002, 3083 | 0.52882099999999999, 3084 | 0.87843099999999996, 3085 | 0.99689799999999995, 3086 | 0.76959100000000003, 3087 | 0.53489200000000003, 3088 | 0.88235300000000005, 3089 | 0.99672700000000003, 3090 | 0.77679500000000001, 3091 | 0.54103900000000005, 3092 | 0.88627500000000003, 3093 | 0.99657099999999998, 3094 | 0.78397700000000003, 3095 | 0.54723299999999997, 3096 | 0.89019599999999999, 3097 | 0.99636899999999995, 3098 | 0.79116699999999995, 3099 | 0.55349899999999996, 3100 | 0.89411799999999997, 3101 | 0.99616199999999999, 3102 | 0.79834799999999995, 3103 | 0.55981999999999998, 3104 | 0.89803900000000003, 3105 | 0.99593200000000004, 3106 | 0.80552699999999999, 3107 | 0.56620199999999998, 3108 | 0.90196100000000001, 3109 | 0.99568000000000001, 3110 | 0.81270600000000004, 3111 | 0.57264499999999996, 3112 | 0.90588199999999997, 3113 | 0.99542399999999998, 3114 | 0.81987500000000002, 3115 | 0.57913999999999999, 3116 | 0.90980399999999995, 3117 | 0.99513099999999999, 3118 | 0.82705200000000001, 3119 | 0.58570100000000003, 3120 | 0.91372500000000001, 3121 | 0.99485100000000004, 3122 | 0.83421299999999998, 3123 | 0.59230700000000003, 3124 | 0.91764699999999999, 3125 | 0.99452399999999996, 3126 | 0.841387, 3127 | 0.59898300000000004, 3128 | 0.92156899999999997, 3129 | 0.99422200000000005, 3130 | 0.84853999999999996, 3131 | 0.60569600000000001, 3132 | 0.92549000000000003, 3133 | 0.99386600000000003, 3134 | 0.855711, 3135 | 0.61248199999999997, 3136 | 0.92941200000000002, 3137 | 0.99354500000000001, 3138 | 0.86285900000000004, 3139 | 0.61929900000000004, 3140 | 0.93333299999999997, 3141 | 0.99317, 3142 | 0.87002400000000002, 3143 | 0.626189, 3144 | 0.93725499999999995, 3145 | 0.99283100000000002, 3146 | 0.87716799999999995, 3147 | 0.63310900000000003, 3148 | 0.94117600000000001, 3149 | 0.99243999999999999, 3150 | 0.88432999999999995, 3151 | 0.64009899999999997, 3152 | 0.94509799999999999, 3153 | 0.992089, 3154 | 0.89146999999999998, 3155 | 0.64711600000000002, 3156 | 0.94901999999999997, 3157 | 0.99168800000000001, 3158 | 0.89862699999999995, 3159 | 0.65420199999999995, 3160 | 0.95294100000000004, 3161 | 0.99133199999999999, 3162 | 0.90576299999999998, 3163 | 0.66130900000000004, 3164 | 0.95686300000000002, 3165 | 0.99092999999999998, 3166 | 0.91291500000000003, 3167 | 0.66848099999999999, 3168 | 0.96078399999999997, 3169 | 0.99056999999999995, 3170 | 0.92004900000000001, 3171 | 0.67567500000000003, 3172 | 0.96470599999999995, 3173 | 0.99017500000000003, 3174 | 0.92719600000000002, 3175 | 0.68292600000000003, 3176 | 0.96862700000000002, 3177 | 0.989815, 3178 | 0.93432899999999997, 3179 | 0.69019799999999998, 3180 | 0.972549, 3181 | 0.98943400000000004, 3182 | 0.94147000000000003, 3183 | 0.697519, 3184 | 0.97647099999999998, 3185 | 0.98907699999999998, 3186 | 0.948604, 3187 | 0.70486300000000002, 3188 | 0.98039200000000004, 3189 | 0.98871699999999996, 3190 | 0.95574199999999998, 3191 | 0.71224200000000004, 3192 | 0.98431400000000002, 3193 | 0.988367, 3194 | 0.96287800000000001, 3195 | 0.71964899999999998, 3196 | 0.98823499999999997, 3197 | 0.98803300000000005, 3198 | 0.97001199999999999, 3199 | 0.72707699999999997, 3200 | 0.99215699999999996, 3201 | 0.98769099999999999, 3202 | 0.97715399999999997, 3203 | 0.73453599999999997, 3204 | 0.99607800000000002, 3205 | 0.98738700000000001, 3206 | 0.98428800000000005, 3207 | 0.74200200000000005, 3208 | 1.0, 3209 | 0.98705299999999996, 3210 | 0.99143800000000004, 3211 | 0.74950399999999995 3212 | ], 3213 | "Source" : "https://github.com/BIDS/colormap/blob/master/colormaps.py" 3214 | }, 3215 | { 3216 | "ColorSpace" : "Diverging", 3217 | "Creator" : "Nathaniel J. Smith & Stefan van der Walt", 3218 | "License" : "CC0", 3219 | "Name" : "Plasma (matplotlib)", 3220 | "NanColor" : 3221 | [ 3222 | 0, 3223 | 1, 3224 | 0 3225 | ], 3226 | "RGBPoints" : 3227 | [ 3228 | 0.0, 3229 | 0.050382999999999997, 3230 | 0.029803, 3231 | 0.52797499999999997, 3232 | 0.0039220000000000001, 3233 | 0.063535999999999995, 3234 | 0.028426, 3235 | 0.53312400000000004, 3236 | 0.0078429999999999993, 3237 | 0.075353000000000003, 3238 | 0.027206000000000001, 3239 | 0.53800700000000001, 3240 | 0.011764999999999999, 3241 | 0.086221999999999993, 3242 | 0.026124999999999999, 3243 | 0.54265799999999997, 3244 | 0.015685999999999999, 3245 | 0.096379000000000006, 3246 | 0.025165, 3247 | 0.54710300000000001, 3248 | 0.019608, 3249 | 0.10598, 3250 | 0.024309000000000001, 3251 | 0.55136799999999997, 3252 | 0.023529000000000001, 3253 | 0.115124, 3254 | 0.023556000000000001, 3255 | 0.55546799999999996, 3256 | 0.027451, 3257 | 0.123903, 3258 | 0.022877999999999999, 3259 | 0.559423, 3260 | 0.031372999999999998, 3261 | 0.132381, 3262 | 0.022258, 3263 | 0.56325000000000003, 3264 | 0.035293999999999999, 3265 | 0.14060300000000001, 3266 | 0.021687000000000001, 3267 | 0.56695899999999999, 3268 | 0.039216000000000001, 3269 | 0.14860699999999999, 3270 | 0.021153999999999999, 3271 | 0.57056200000000001, 3272 | 0.043137000000000002, 3273 | 0.156421, 3274 | 0.020650999999999999, 3275 | 0.57406500000000005, 3276 | 0.047058999999999997, 3277 | 0.16406999999999999, 3278 | 0.020171000000000001, 3279 | 0.57747800000000005, 3280 | 0.050979999999999998, 3281 | 0.171574, 3282 | 0.019706000000000001, 3283 | 0.58080600000000004, 3284 | 0.054901999999999999, 3285 | 0.17895, 3286 | 0.019251999999999998, 3287 | 0.58405399999999996, 3288 | 0.058824000000000001, 3289 | 0.18621299999999999, 3290 | 0.018803, 3291 | 0.58722799999999997, 3292 | 0.062744999999999995, 3293 | 0.19337399999999999, 3294 | 0.018353999999999999, 3295 | 0.59033000000000002, 3296 | 0.066667000000000004, 3297 | 0.20044500000000001, 3298 | 0.017902000000000001, 3299 | 0.593364, 3300 | 0.070587999999999998, 3301 | 0.20743500000000001, 3302 | 0.017441999999999999, 3303 | 0.596333, 3304 | 0.074510000000000007, 3305 | 0.21435000000000001, 3306 | 0.016972999999999999, 3307 | 0.59923899999999997, 3308 | 0.078431000000000001, 3309 | 0.221197, 3310 | 0.016497000000000001, 3311 | 0.60208300000000003, 3312 | 0.082352999999999996, 3313 | 0.22798299999999999, 3314 | 0.016007, 3315 | 0.60486700000000004, 3316 | 0.086275000000000004, 3317 | 0.23471500000000001, 3318 | 0.015502, 3319 | 0.60759200000000002, 3320 | 0.090195999999999998, 3321 | 0.241396, 3322 | 0.014978999999999999, 3323 | 0.610259, 3324 | 0.094117999999999993, 3325 | 0.248032, 3326 | 0.014439, 3327 | 0.61286799999999997, 3328 | 0.098039000000000001, 3329 | 0.25462699999999999, 3330 | 0.013882, 3331 | 0.61541900000000005, 3332 | 0.101961, 3333 | 0.261183, 3334 | 0.013308, 3335 | 0.61791099999999999, 3336 | 0.105882, 3337 | 0.26770300000000002, 3338 | 0.012716, 3339 | 0.62034599999999995, 3340 | 0.109804, 3341 | 0.27419100000000002, 3342 | 0.012109, 3343 | 0.622722, 3344 | 0.11372500000000001, 3345 | 0.28064800000000001, 3346 | 0.011488, 3347 | 0.62503799999999998, 3348 | 0.117647, 3349 | 0.287076, 3350 | 0.010855, 3351 | 0.62729500000000005, 3352 | 0.121569, 3353 | 0.29347800000000002, 3354 | 0.010213, 3355 | 0.62948999999999999, 3356 | 0.12548999999999999, 3357 | 0.29985499999999998, 3358 | 0.0095610000000000001, 3359 | 0.63162399999999996, 3360 | 0.129412, 3361 | 0.30620999999999998, 3362 | 0.0089020000000000002, 3363 | 0.63369399999999998, 3364 | 0.13333300000000001, 3365 | 0.31254300000000002, 3366 | 0.0082389999999999998, 3367 | 0.63570000000000004, 3368 | 0.13725499999999999, 3369 | 0.31885599999999997, 3370 | 0.0075760000000000003, 3371 | 0.63763999999999998, 3372 | 0.141176, 3373 | 0.32514999999999999, 3374 | 0.0069150000000000001, 3375 | 0.63951199999999997, 3376 | 0.145098, 3377 | 0.331426, 3378 | 0.0062610000000000001, 3379 | 0.641316, 3380 | 0.14902000000000001, 3381 | 0.33768300000000001, 3382 | 0.0056179999999999997, 3383 | 0.64304899999999998, 3384 | 0.15294099999999999, 3385 | 0.34392499999999998, 3386 | 0.0049909999999999998, 3387 | 0.64471000000000001, 3388 | 0.156863, 3389 | 0.35015000000000002, 3390 | 0.0043819999999999996, 3391 | 0.64629800000000004, 3392 | 0.16078400000000001, 3393 | 0.35635899999999998, 3394 | 0.0037980000000000002, 3395 | 0.64781, 3396 | 0.16470599999999999, 3397 | 0.36255300000000001, 3398 | 0.0032429999999999998, 3399 | 0.64924499999999996, 3400 | 0.168627, 3401 | 0.36873299999999998, 3402 | 0.0027239999999999999, 3403 | 0.65060099999999998, 3404 | 0.17254900000000001, 3405 | 0.37489699999999998, 3406 | 0.002245, 3407 | 0.65187600000000001, 3408 | 0.17647099999999999, 3409 | 0.38104700000000002, 3410 | 0.0018140000000000001, 3411 | 0.65306799999999998, 3412 | 0.180392, 3413 | 0.387183, 3414 | 0.0014339999999999999, 3415 | 0.65417700000000001, 3416 | 0.18431400000000001, 3417 | 0.39330399999999999, 3418 | 0.001114, 3419 | 0.65519899999999998, 3420 | 0.18823500000000001, 3421 | 0.39941100000000002, 3422 | 0.00085899999999999995, 3423 | 0.65613299999999997, 3424 | 0.19215699999999999, 3425 | 0.405503, 3426 | 0.000678, 3427 | 0.65697700000000003, 3428 | 0.196078, 3429 | 0.41158, 3430 | 0.00057700000000000004, 3431 | 0.65773000000000004, 3432 | 0.20000000000000001, 3433 | 0.41764200000000001, 3434 | 0.00056400000000000005, 3435 | 0.65839000000000003, 3436 | 0.20392199999999999, 3437 | 0.42368899999999998, 3438 | 0.00064599999999999998, 3439 | 0.65895599999999999, 3440 | 0.207843, 3441 | 0.42971900000000002, 3442 | 0.00083100000000000003, 3443 | 0.65942500000000004, 3444 | 0.21176500000000001, 3445 | 0.43573400000000001, 3446 | 0.001127, 3447 | 0.65979699999999997, 3448 | 0.21568599999999999, 3449 | 0.44173200000000001, 3450 | 0.0015399999999999999, 3451 | 0.66006900000000002, 3452 | 0.219608, 3453 | 0.447714, 3454 | 0.0020799999999999998, 3455 | 0.66024000000000005, 3456 | 0.22352900000000001, 3457 | 0.453677, 3458 | 0.0027550000000000001, 3459 | 0.66030999999999995, 3460 | 0.22745099999999999, 3461 | 0.459623, 3462 | 0.0035739999999999999, 3463 | 0.660277, 3464 | 0.231373, 3465 | 0.46555000000000002, 3466 | 0.0045450000000000004, 3467 | 0.66013900000000003, 3468 | 0.235294, 3469 | 0.47145700000000001, 3470 | 0.0056779999999999999, 3471 | 0.65989699999999996, 3472 | 0.23921600000000001, 3473 | 0.47734399999999999, 3474 | 0.0069800000000000001, 3475 | 0.65954900000000005, 3476 | 0.24313699999999999, 3477 | 0.48320999999999997, 3478 | 0.0084600000000000005, 3479 | 0.65909499999999999, 3480 | 0.247059, 3481 | 0.48905500000000002, 3482 | 0.010127000000000001, 3483 | 0.65853399999999995, 3484 | 0.25097999999999998, 3485 | 0.49487700000000001, 3486 | 0.011990000000000001, 3487 | 0.65786500000000003, 3488 | 0.25490200000000002, 3489 | 0.50067799999999996, 3490 | 0.014055, 3491 | 0.65708800000000001, 3492 | 0.258824, 3493 | 0.50645399999999996, 3494 | 0.016333, 3495 | 0.65620199999999995, 3496 | 0.26274500000000001, 3497 | 0.51220600000000005, 3498 | 0.018832999999999999, 3499 | 0.65520900000000004, 3500 | 0.26666699999999999, 3501 | 0.51793299999999998, 3502 | 0.021562999999999999, 3503 | 0.65410900000000005, 3504 | 0.270588, 3505 | 0.52363300000000002, 3506 | 0.024532000000000002, 3507 | 0.65290099999999995, 3508 | 0.27450999999999998, 3509 | 0.52930600000000005, 3510 | 0.027747000000000001, 3511 | 0.651586, 3512 | 0.27843099999999998, 3513 | 0.53495199999999998, 3514 | 0.031217000000000002, 3515 | 0.65016499999999999, 3516 | 0.28235300000000002, 3517 | 0.54056999999999999, 3518 | 0.034950000000000002, 3519 | 0.64863999999999999, 3520 | 0.286275, 3521 | 0.546157, 3522 | 0.038954000000000003, 3523 | 0.64700999999999997, 3524 | 0.29019600000000001, 3525 | 0.55171499999999996, 3526 | 0.043136000000000001, 3527 | 0.64527699999999999, 3528 | 0.29411799999999999, 3529 | 0.55724300000000004, 3530 | 0.047330999999999998, 3531 | 0.64344299999999999, 3532 | 0.298039, 3533 | 0.56273799999999996, 3534 | 0.051545000000000001, 3535 | 0.641509, 3536 | 0.30196099999999998, 3537 | 0.56820099999999996, 3538 | 0.055778000000000001, 3539 | 0.63947699999999996, 3540 | 0.30588199999999999, 3541 | 0.57363200000000003, 3542 | 0.060027999999999998, 3543 | 0.63734900000000005, 3544 | 0.30980400000000002, 3545 | 0.57902900000000002, 3546 | 0.064296000000000006, 3547 | 0.63512599999999997, 3548 | 0.31372499999999998, 3549 | 0.58439099999999999, 3550 | 0.068579000000000001, 3551 | 0.63281200000000004, 3552 | 0.31764700000000001, 3553 | 0.58971899999999999, 3554 | 0.072877999999999998, 3555 | 0.63040799999999997, 3556 | 0.32156899999999999, 3557 | 0.59501099999999996, 3558 | 0.077189999999999995, 3559 | 0.62791699999999995, 3560 | 0.32549, 3561 | 0.60026599999999997, 3562 | 0.081516000000000005, 3563 | 0.62534199999999995, 3564 | 0.32941199999999998, 3565 | 0.60548500000000005, 3566 | 0.085854, 3567 | 0.62268599999999996, 3568 | 0.33333299999999999, 3569 | 0.61066699999999996, 3570 | 0.090204000000000006, 3571 | 0.61995100000000003, 3572 | 0.33725500000000003, 3573 | 0.61581200000000003, 3574 | 0.094563999999999995, 3575 | 0.61714000000000002, 3576 | 0.34117599999999998, 3577 | 0.620919, 3578 | 0.098933999999999994, 3579 | 0.61425700000000005, 3580 | 0.34509800000000002, 3581 | 0.62598699999999996, 3582 | 0.103312, 3583 | 0.61130499999999999, 3584 | 0.34902, 3585 | 0.63101700000000005, 3586 | 0.107699, 3587 | 0.60828700000000002, 3588 | 0.352941, 3589 | 0.63600800000000002, 3590 | 0.112092, 3591 | 0.60520499999999999, 3592 | 0.35686299999999999, 3593 | 0.64095899999999995, 3594 | 0.116492, 3595 | 0.60206499999999996, 3596 | 0.36078399999999999, 3597 | 0.645872, 3598 | 0.12089800000000001, 3599 | 0.59886700000000004, 3600 | 0.36470599999999997, 3601 | 0.65074600000000005, 3602 | 0.125309, 3603 | 0.59561699999999995, 3604 | 0.36862699999999998, 3605 | 0.65558000000000005, 3606 | 0.12972500000000001, 3607 | 0.59231699999999998, 3608 | 0.37254900000000002, 3609 | 0.66037400000000002, 3610 | 0.13414400000000001, 3611 | 0.58897100000000002, 3612 | 0.376471, 3613 | 0.66512899999999997, 3614 | 0.13856599999999999, 3615 | 0.58558200000000005, 3616 | 0.38039200000000001, 3617 | 0.66984500000000002, 3618 | 0.14299200000000001, 3619 | 0.58215399999999995, 3620 | 0.38431399999999999, 3621 | 0.67452199999999995, 3622 | 0.14741899999999999, 3623 | 0.57868799999999998, 3624 | 0.388235, 3625 | 0.67915999999999999, 3626 | 0.15184800000000001, 3627 | 0.57518899999999995, 3628 | 0.39215699999999998, 3629 | 0.68375799999999998, 3630 | 0.156278, 3631 | 0.57165999999999995, 3632 | 0.39607799999999999, 3633 | 0.68831799999999999, 3634 | 0.16070899999999999, 3635 | 0.56810300000000002, 3636 | 0.40000000000000002, 3637 | 0.69284000000000001, 3638 | 0.16514100000000001, 3639 | 0.56452199999999997, 3640 | 0.403922, 3641 | 0.69732400000000005, 3642 | 0.169573, 3643 | 0.56091899999999995, 3644 | 0.40784300000000001, 3645 | 0.70176899999999998, 3646 | 0.17400499999999999, 3647 | 0.55729600000000001, 3648 | 0.41176499999999999, 3649 | 0.70617799999999997, 3650 | 0.17843700000000001, 3651 | 0.55365699999999995, 3652 | 0.415686, 3653 | 0.71054899999999999, 3654 | 0.182868, 3655 | 0.55000400000000005, 3656 | 0.41960799999999998, 3657 | 0.71488300000000005, 3658 | 0.18729899999999999, 3659 | 0.54633799999999999, 3660 | 0.42352899999999999, 3661 | 0.71918099999999996, 3662 | 0.19172900000000001, 3663 | 0.54266300000000001, 3664 | 0.42745100000000003, 3665 | 0.72344399999999998, 3666 | 0.196158, 3667 | 0.53898100000000004, 3668 | 0.43137300000000001, 3669 | 0.72767000000000004, 3670 | 0.20058599999999999, 3671 | 0.53529300000000002, 3672 | 0.43529400000000001, 3673 | 0.73186200000000001, 3674 | 0.205013, 3675 | 0.53160099999999999, 3676 | 0.439216, 3677 | 0.73601899999999998, 3678 | 0.20943899999999999, 3679 | 0.52790800000000004, 3680 | 0.443137, 3681 | 0.740143, 3682 | 0.213864, 3683 | 0.52421600000000002, 3684 | 0.44705899999999998, 3685 | 0.744232, 3686 | 0.21828800000000001, 3687 | 0.52052399999999999, 3688 | 0.45097999999999999, 3689 | 0.74828899999999998, 3690 | 0.22271099999999999, 3691 | 0.51683400000000002, 3692 | 0.45490199999999997, 3693 | 0.75231199999999998, 3694 | 0.227133, 3695 | 0.51314899999999997, 3696 | 0.45882400000000001, 3697 | 0.75630399999999998, 3698 | 0.23155500000000001, 3699 | 0.50946800000000003, 3700 | 0.46274500000000002, 3701 | 0.76026400000000005, 3702 | 0.23597599999999999, 3703 | 0.50579399999999997, 3704 | 0.466667, 3705 | 0.76419300000000001, 3706 | 0.240396, 3707 | 0.50212599999999996, 3708 | 0.47058800000000001, 3709 | 0.76809000000000005, 3710 | 0.24481700000000001, 3711 | 0.49846499999999999, 3712 | 0.47450999999999999, 3713 | 0.77195800000000003, 3714 | 0.24923699999999999, 3715 | 0.494813, 3716 | 0.478431, 3717 | 0.77579600000000004, 3718 | 0.25365799999999999, 3719 | 0.49117100000000002, 3720 | 0.48235299999999998, 3721 | 0.77960399999999996, 3722 | 0.25807799999999997, 3723 | 0.487539, 3724 | 0.48627500000000001, 3725 | 0.78338300000000005, 3726 | 0.26250000000000001, 3727 | 0.48391800000000001, 3728 | 0.49019600000000002, 3729 | 0.78713299999999997, 3730 | 0.26692199999999999, 3731 | 0.48030699999999998, 3732 | 0.494118, 3733 | 0.79085499999999997, 3734 | 0.271345, 3735 | 0.47670600000000002, 3736 | 0.49803900000000001, 3737 | 0.79454899999999995, 3738 | 0.27577000000000002, 3739 | 0.47311700000000001, 3740 | 0.50196099999999999, 3741 | 0.79821600000000004, 3742 | 0.28019699999999997, 3743 | 0.46953800000000001, 3744 | 0.50588200000000005, 3745 | 0.80185499999999998, 3746 | 0.28462599999999999, 3747 | 0.46597100000000002, 3748 | 0.50980400000000003, 3749 | 0.80546700000000004, 3750 | 0.28905700000000001, 3751 | 0.46241500000000002, 3752 | 0.51372499999999999, 3753 | 0.80905199999999999, 3754 | 0.293491, 3755 | 0.45887, 3756 | 0.51764699999999997, 3757 | 0.812612, 3758 | 0.29792800000000003, 3759 | 0.45533800000000002, 3760 | 0.52156899999999995, 3761 | 0.81614399999999998, 3762 | 0.30236800000000003, 3763 | 0.451816, 3764 | 0.52549000000000001, 3765 | 0.81965100000000002, 3766 | 0.30681199999999997, 3767 | 0.44830599999999998, 3768 | 0.52941199999999999, 3769 | 0.82313199999999997, 3770 | 0.31126100000000001, 3771 | 0.44480599999999998, 3772 | 0.53333299999999995, 3773 | 0.82658799999999999, 3774 | 0.31571399999999999, 3775 | 0.44131599999999999, 3776 | 0.53725500000000004, 3777 | 0.83001800000000003, 3778 | 0.32017200000000001, 3779 | 0.437836, 3780 | 0.54117599999999999, 3781 | 0.833422, 3782 | 0.32463500000000001, 3783 | 0.43436599999999997, 3784 | 0.54509799999999997, 3785 | 0.83680100000000002, 3786 | 0.32910499999999998, 3787 | 0.43090499999999998, 3788 | 0.54901999999999995, 3789 | 0.84015499999999999, 3790 | 0.33357999999999999, 3791 | 0.42745499999999997, 3792 | 0.55294100000000002, 3793 | 0.84348400000000001, 3794 | 0.33806199999999997, 3795 | 0.42401299999999997, 3796 | 0.556863, 3797 | 0.84678799999999999, 3798 | 0.34255099999999999, 3799 | 0.42057899999999998, 3800 | 0.56078399999999995, 3801 | 0.85006599999999999, 3802 | 0.34704800000000002, 3803 | 0.417153, 3804 | 0.56470600000000004, 3805 | 0.85331900000000005, 3806 | 0.351553, 3807 | 0.41373399999999999, 3808 | 0.56862699999999999, 3809 | 0.85654699999999995, 3810 | 0.35606599999999999, 3811 | 0.41032200000000002, 3812 | 0.57254899999999997, 3813 | 0.85975000000000001, 3814 | 0.36058800000000002, 3815 | 0.40691699999999997, 3816 | 0.57647099999999996, 3817 | 0.862927, 3818 | 0.36511900000000003, 3819 | 0.40351900000000002, 3820 | 0.58039200000000002, 3821 | 0.86607800000000001, 3822 | 0.36965999999999999, 3823 | 0.40012599999999998, 3824 | 0.584314, 3825 | 0.86920299999999995, 3826 | 0.37421199999999999, 3827 | 0.39673799999999998, 3828 | 0.58823499999999995, 3829 | 0.87230300000000005, 3830 | 0.378774, 3831 | 0.39335500000000001, 3832 | 0.59215700000000004, 3833 | 0.87537600000000004, 3834 | 0.38334699999999999, 3835 | 0.38997599999999999, 3836 | 0.596078, 3837 | 0.87842299999999995, 3838 | 0.387932, 3839 | 0.3866, 3840 | 0.59999999999999998, 3841 | 0.88144299999999998, 3842 | 0.39252900000000002, 3843 | 0.38322899999999999, 3844 | 0.60392199999999996, 3845 | 0.884436, 3846 | 0.39713900000000002, 3847 | 0.37985999999999998, 3848 | 0.60784300000000002, 3849 | 0.88740200000000002, 3850 | 0.40176200000000001, 3851 | 0.376494, 3852 | 0.611765, 3853 | 0.89034000000000002, 3854 | 0.40639799999999998, 3855 | 0.37313000000000002, 3856 | 0.61568599999999996, 3857 | 0.89324999999999999, 3858 | 0.41104800000000002, 3859 | 0.36976799999999999, 3860 | 0.61960800000000005, 3861 | 0.89613100000000001, 3862 | 0.41571200000000003, 3863 | 0.36640699999999998, 3864 | 0.623529, 3865 | 0.89898400000000001, 3866 | 0.42039199999999999, 3867 | 0.36304700000000001, 3868 | 0.62745099999999998, 3869 | 0.90180700000000003, 3870 | 0.42508699999999999, 3871 | 0.35968800000000001, 3872 | 0.63137299999999996, 3873 | 0.90460099999999999, 3874 | 0.42979699999999998, 3875 | 0.35632900000000001, 3876 | 0.63529400000000003, 3877 | 0.90736499999999998, 3878 | 0.43452400000000002, 3879 | 0.35297000000000001, 3880 | 0.63921600000000001, 3881 | 0.91009799999999996, 3882 | 0.43926799999999999, 3883 | 0.34960999999999998, 3884 | 0.64313699999999996, 3885 | 0.91279999999999994, 3886 | 0.44402900000000001, 3887 | 0.34625099999999998, 3888 | 0.64705900000000005, 3889 | 0.91547100000000003, 3890 | 0.44880700000000001, 3891 | 0.34288999999999997, 3892 | 0.65098, 3893 | 0.91810899999999995, 3894 | 0.45360299999999998, 3895 | 0.33952900000000003, 3896 | 0.65490199999999998, 3897 | 0.92071400000000003, 3898 | 0.45841700000000002, 3899 | 0.33616600000000002, 3900 | 0.65882399999999997, 3901 | 0.92328699999999997, 3902 | 0.46325100000000002, 3903 | 0.33280100000000001, 3904 | 0.66274500000000003, 3905 | 0.92582500000000001, 3906 | 0.46810299999999999, 3907 | 0.32943499999999998, 3908 | 0.66666700000000001, 3909 | 0.92832899999999996, 3910 | 0.47297499999999998, 3911 | 0.326067, 3912 | 0.67058799999999996, 3913 | 0.93079800000000001, 3914 | 0.47786699999999999, 3915 | 0.32269700000000001, 3916 | 0.67451000000000005, 3917 | 0.93323199999999995, 3918 | 0.48277999999999999, 3919 | 0.31932500000000003, 3920 | 0.67843100000000001, 3921 | 0.93562999999999996, 3922 | 0.48771199999999998, 3923 | 0.31595200000000001, 3924 | 0.68235299999999999, 3925 | 0.93798999999999999, 3926 | 0.49266700000000002, 3927 | 0.31257499999999999, 3928 | 0.68627499999999997, 3929 | 0.94031299999999995, 3930 | 0.49764199999999997, 3931 | 0.309197, 3932 | 0.69019600000000003, 3933 | 0.94259800000000005, 3934 | 0.50263899999999995, 3935 | 0.30581599999999998, 3936 | 0.69411800000000001, 3937 | 0.94484400000000002, 3938 | 0.50765800000000005, 3939 | 0.30243300000000001, 3940 | 0.69803899999999997, 3941 | 0.94705099999999998, 3942 | 0.51269900000000002, 3943 | 0.29904900000000001, 3944 | 0.70196099999999995, 3945 | 0.94921699999999998, 3946 | 0.51776299999999997, 3947 | 0.29566199999999998, 3948 | 0.70588200000000001, 3949 | 0.95134399999999997, 3950 | 0.52285000000000004, 3951 | 0.29227500000000001, 3952 | 0.70980399999999999, 3953 | 0.95342800000000005, 3954 | 0.52795999999999998, 3955 | 0.288883, 3956 | 0.71372500000000005, 3957 | 0.95547000000000004, 3958 | 0.53309300000000004, 3959 | 0.28549000000000002, 3960 | 0.71764700000000003, 3961 | 0.95746900000000001, 3962 | 0.53825000000000001, 3963 | 0.28209600000000001, 3964 | 0.72156900000000002, 3965 | 0.95942400000000005, 3966 | 0.543431, 3967 | 0.27870099999999998, 3968 | 0.72548999999999997, 3969 | 0.96133599999999997, 3970 | 0.54863600000000001, 3971 | 0.27530500000000002, 3972 | 0.72941199999999995, 3973 | 0.96320300000000003, 3974 | 0.55386500000000005, 3975 | 0.27190900000000001, 3976 | 0.73333300000000001, 3977 | 0.96502399999999999, 3978 | 0.559118, 3979 | 0.268513, 3980 | 0.73725499999999999, 3981 | 0.96679800000000005, 3982 | 0.56439600000000001, 3983 | 0.26511800000000002, 3984 | 0.74117599999999995, 3985 | 0.968526, 3986 | 0.56969999999999998, 3987 | 0.26172099999999998, 3988 | 0.74509800000000004, 3989 | 0.97020499999999998, 3990 | 0.57502799999999998, 3991 | 0.25832500000000003, 3992 | 0.74902000000000002, 3993 | 0.971835, 3994 | 0.58038199999999995, 3995 | 0.25493100000000002, 3996 | 0.75294099999999997, 3997 | 0.97341599999999995, 3998 | 0.58576099999999998, 3999 | 0.25153999999999999, 4000 | 0.75686299999999995, 4001 | 0.97494700000000001, 4002 | 0.59116500000000005, 4003 | 0.24815100000000001, 4004 | 0.76078400000000002, 4005 | 0.97642799999999996, 4006 | 0.59659499999999999, 4007 | 0.24476700000000001, 4008 | 0.764706, 4009 | 0.97785599999999995, 4010 | 0.602051, 4011 | 0.24138699999999999, 4012 | 0.76862699999999995, 4013 | 0.97923300000000002, 4014 | 0.60753199999999996, 4015 | 0.238013, 4016 | 0.77254900000000004, 4017 | 0.98055599999999998, 4018 | 0.613039, 4019 | 0.23464599999999999, 4020 | 0.77647100000000002, 4021 | 0.98182599999999998, 4022 | 0.61857200000000001, 4023 | 0.23128699999999999, 4024 | 0.78039199999999997, 4025 | 0.98304100000000005, 4026 | 0.62413099999999999, 4027 | 0.227937, 4028 | 0.78431399999999996, 4029 | 0.98419900000000005, 4030 | 0.629718, 4031 | 0.22459499999999999, 4032 | 0.78823500000000002, 4033 | 0.98530099999999998, 4034 | 0.63532999999999995, 4035 | 0.22126499999999999, 4036 | 0.792157, 4037 | 0.98634500000000003, 4038 | 0.64096900000000001, 4039 | 0.217948, 4040 | 0.79607799999999995, 4041 | 0.98733199999999999, 4042 | 0.64663300000000001, 4043 | 0.21464800000000001, 4044 | 0.80000000000000004, 4045 | 0.98826000000000003, 4046 | 0.65232500000000004, 4047 | 0.211364, 4048 | 0.80392200000000003, 4049 | 0.98912800000000001, 4050 | 0.65804300000000004, 4051 | 0.20810000000000001, 4052 | 0.80784299999999998, 4053 | 0.98993500000000001, 4054 | 0.66378700000000002, 4055 | 0.20485900000000001, 4056 | 0.81176499999999996, 4057 | 0.99068100000000003, 4058 | 0.66955799999999999, 4059 | 0.20164199999999999, 4060 | 0.81568600000000002, 4061 | 0.99136500000000005, 4062 | 0.67535500000000004, 4063 | 0.19845299999999999, 4064 | 0.819608, 4065 | 0.99198500000000001, 4066 | 0.68117899999999998, 4067 | 0.195295, 4068 | 0.82352899999999996, 4069 | 0.99254100000000001, 4070 | 0.68703000000000003, 4071 | 0.19217000000000001, 4072 | 0.82745100000000005, 4073 | 0.99303200000000003, 4074 | 0.69290700000000005, 4075 | 0.189084, 4076 | 0.83137300000000003, 4077 | 0.99345600000000001, 4078 | 0.69881000000000004, 4079 | 0.18604100000000001, 4080 | 0.83529399999999998, 4081 | 0.99381399999999998, 4082 | 0.70474099999999995, 4083 | 0.18304300000000001, 4084 | 0.83921599999999996, 4085 | 0.99410299999999996, 4086 | 0.71069800000000005, 4087 | 0.18009700000000001, 4088 | 0.84313700000000003, 4089 | 0.99432399999999999, 4090 | 0.71668100000000001, 4091 | 0.177208, 4092 | 0.84705900000000001, 4093 | 0.99447399999999997, 4094 | 0.72269099999999997, 4095 | 0.17438100000000001, 4096 | 0.85097999999999996, 4097 | 0.99455300000000002, 4098 | 0.72872800000000004, 4099 | 0.171622, 4100 | 0.85490200000000005, 4101 | 0.99456100000000003, 4102 | 0.73479099999999997, 4103 | 0.168938, 4104 | 0.85882400000000003, 4105 | 0.99449500000000002, 4106 | 0.74087999999999998, 4107 | 0.16633500000000001, 4108 | 0.86274499999999998, 4109 | 0.99435499999999999, 4110 | 0.74699499999999996, 4111 | 0.16382099999999999, 4112 | 0.86666699999999997, 4113 | 0.99414100000000005, 4114 | 0.75313699999999995, 4115 | 0.16140399999999999, 4116 | 0.87058800000000003, 4117 | 0.99385100000000004, 4118 | 0.75930399999999998, 4119 | 0.15909200000000001, 4120 | 0.87451000000000001, 4121 | 0.99348199999999998, 4122 | 0.76549900000000004, 4123 | 0.156891, 4124 | 0.87843099999999996, 4125 | 0.99303300000000005, 4126 | 0.77171999999999996, 4127 | 0.154808, 4128 | 0.88235300000000005, 4129 | 0.99250499999999997, 4130 | 0.77796699999999996, 4131 | 0.15285499999999999, 4132 | 0.88627500000000003, 4133 | 0.99189700000000003, 4134 | 0.78423900000000002, 4135 | 0.15104200000000001, 4136 | 0.89019599999999999, 4137 | 0.99120900000000001, 4138 | 0.79053700000000005, 4139 | 0.14937700000000001, 4140 | 0.89411799999999997, 4141 | 0.99043899999999996, 4142 | 0.79685899999999998, 4143 | 0.14787, 4144 | 0.89803900000000003, 4145 | 0.98958699999999999, 4146 | 0.80320499999999995, 4147 | 0.14652899999999999, 4148 | 0.90196100000000001, 4149 | 0.98864799999999997, 4150 | 0.80957900000000005, 4151 | 0.14535699999999999, 4152 | 0.90588199999999997, 4153 | 0.98762099999999997, 4154 | 0.81597799999999998, 4155 | 0.14436299999999999, 4156 | 0.90980399999999995, 4157 | 0.98650899999999997, 4158 | 0.82240100000000005, 4159 | 0.14355699999999999, 4160 | 0.91372500000000001, 4161 | 0.98531400000000002, 4162 | 0.82884599999999997, 4163 | 0.14294499999999999, 4164 | 0.91764699999999999, 4165 | 0.98403099999999999, 4166 | 0.83531500000000003, 4167 | 0.14252799999999999, 4168 | 0.92156899999999997, 4169 | 0.982653, 4170 | 0.841812, 4171 | 0.14230300000000001, 4172 | 0.92549000000000003, 4173 | 0.98119000000000001, 4174 | 0.848329, 4175 | 0.14227899999999999, 4176 | 0.92941200000000002, 4177 | 0.97964399999999996, 4178 | 0.85486600000000001, 4179 | 0.142453, 4180 | 0.93333299999999997, 4181 | 0.97799499999999995, 4182 | 0.86143199999999998, 4183 | 0.14280799999999999, 4184 | 0.93725499999999995, 4185 | 0.97626500000000005, 4186 | 0.86801600000000001, 4187 | 0.14335100000000001, 4188 | 0.94117600000000001, 4189 | 0.97444299999999995, 4190 | 0.87462200000000001, 4191 | 0.14406099999999999, 4192 | 0.94509799999999999, 4193 | 0.97253000000000001, 4194 | 0.88124999999999998, 4195 | 0.144923, 4196 | 0.94901999999999997, 4197 | 0.97053299999999998, 4198 | 0.88789600000000002, 4199 | 0.14591899999999999, 4200 | 0.95294100000000004, 4201 | 0.96844300000000005, 4202 | 0.89456400000000003, 4203 | 0.14701400000000001, 4204 | 0.95686300000000002, 4205 | 0.96627099999999999, 4206 | 0.90124899999999997, 4207 | 0.14818000000000001, 4208 | 0.96078399999999997, 4209 | 0.96402100000000002, 4210 | 0.90795000000000003, 4211 | 0.14937, 4212 | 0.96470599999999995, 4213 | 0.96168100000000001, 4214 | 0.91467200000000004, 4215 | 0.15051999999999999, 4216 | 0.96862700000000002, 4217 | 0.95927600000000002, 4218 | 0.92140699999999998, 4219 | 0.15156600000000001, 4220 | 0.972549, 4221 | 0.95680799999999999, 4222 | 0.92815199999999998, 4223 | 0.15240899999999999, 4224 | 0.97647099999999998, 4225 | 0.954287, 4226 | 0.93490799999999996, 4227 | 0.152921, 4228 | 0.98039200000000004, 4229 | 0.95172599999999996, 4230 | 0.94167100000000004, 4231 | 0.15292500000000001, 4232 | 0.98431400000000002, 4233 | 0.94915099999999997, 4234 | 0.94843500000000003, 4235 | 0.15217800000000001, 4236 | 0.98823499999999997, 4237 | 0.94660200000000005, 4238 | 0.95518999999999998, 4239 | 0.15032799999999999, 4240 | 0.99215699999999996, 4241 | 0.94415199999999999, 4242 | 0.96191599999999999, 4243 | 0.14686099999999999, 4244 | 0.99607800000000002, 4245 | 0.94189599999999996, 4246 | 0.96858999999999995, 4247 | 0.140956, 4248 | 1.0, 4249 | 0.94001500000000004, 4250 | 0.97515799999999997, 4251 | 0.131326 4252 | ], 4253 | "Source" : "https://github.com/BIDS/colormap/blob/master/colormaps.py" 4254 | }, 4255 | { 4256 | "ColorSpace" : "RGB", 4257 | "DefaultMap" : true, 4258 | "Name" : "Black-Body Radiation", 4259 | "NanColor" : 4260 | [ 4261 | 0, 4262 | 0.49803921568600001, 4263 | 1 4264 | ], 4265 | "RGBPoints" : 4266 | [ 4267 | 0, 4268 | 0, 4269 | 0, 4270 | 0, 4271 | 0.40000000000000002, 4272 | 0.90196078431399995, 4273 | 0, 4274 | 0, 4275 | 0.80000000000000004, 4276 | 0.90196078431399995, 4277 | 0.90196078431399995, 4278 | 0, 4279 | 1, 4280 | 1, 4281 | 1, 4282 | 1 4283 | ] 4284 | }, 4285 | { 4286 | "ColorSpace" : "RGB", 4287 | "DefaultMap" : true, 4288 | "Name" : "jet", 4289 | "RGBPoints" : 4290 | [ 4291 | -1, 4292 | 0, 4293 | 0, 4294 | 0.5625, 4295 | -0.77777799999999997, 4296 | 0, 4297 | 0, 4298 | 1, 4299 | -0.269841, 4300 | 0, 4301 | 1, 4302 | 1, 4303 | -0.015873000000000002, 4304 | 0.5, 4305 | 1, 4306 | 0.5, 4307 | 0.238095, 4308 | 1, 4309 | 1, 4310 | 0, 4311 | 0.74603200000000003, 4312 | 1, 4313 | 0, 4314 | 0, 4315 | 1, 4316 | 0.5, 4317 | 0, 4318 | 0 4319 | ] 4320 | }, 4321 | { 4322 | "ColorSpace" : "Lab", 4323 | "Name" : "erdc_blue2green_BW", 4324 | "RGBPoints" : 4325 | [ 4326 | -1, 4327 | 3.6357799999999998e-07, 4328 | 0, 4329 | 5.2937400000000001e-06, 4330 | -0.87451000000000001, 4331 | 0.053991499999999998, 4332 | 0.0577948, 4333 | 0.212806, 4334 | -0.74902000000000002, 4335 | 0.062039299999999999, 4336 | 0.075894199999999995, 4337 | 0.388959, 4338 | -0.623529, 4339 | 0.069749900000000004, 4340 | 0.102032, 4341 | 0.54176999999999997, 4342 | -0.49803900000000001, 4343 | 0.11329500000000001, 4344 | 0.15615599999999999, 4345 | 0.64334000000000002, 4346 | -0.37254900000000002, 4347 | 0.15204699999999999, 4348 | 0.243196, 4349 | 0.67028299999999996, 4350 | -0.247059, 4351 | 0.15809599999999999, 4352 | 0.344084, 4353 | 0.62286399999999997, 4354 | -0.121569, 4355 | 0.151142, 4356 | 0.43922, 4357 | 0.53276699999999999, 4358 | 0.0039215700000000001, 4359 | 0.17155000000000001, 4360 | 0.52158800000000005, 4361 | 0.45771899999999999, 4362 | 0.129412, 4363 | 0.22586100000000001, 4364 | 0.59914100000000003, 4365 | 0.36399700000000001, 4366 | 0.25490200000000002, 4367 | 0.32328000000000001, 4368 | 0.67007000000000005, 4369 | 0.25908300000000001, 4370 | 0.38039200000000001, 4371 | 0.44234400000000001, 4372 | 0.73369700000000004, 4373 | 0.22375400000000001, 4374 | 0.50588200000000005, 4375 | 0.55840900000000004, 4376 | 0.79494100000000001, 4377 | 0.257411, 4378 | 0.63137299999999996, 4379 | 0.673875, 4380 | 0.85434399999999999, 4381 | 0.34082200000000001, 4382 | 0.75686299999999995, 4383 | 0.78724400000000005, 4384 | 0.90932599999999997, 4385 | 0.52471699999999999, 4386 | 0.88235300000000005, 4387 | 0.89648300000000003, 4388 | 0.958063, 4389 | 0.77591399999999999, 4390 | 1, 4391 | 1, 4392 | 1, 4393 | 0.99998200000000004 4394 | ] 4395 | }, 4396 | { 4397 | "ColorSpace" : "Lab", 4398 | "Name" : "coolwarm", 4399 | "RGBPoints" : 4400 | [ 4401 | -1, 4402 | 0.22980600000000001, 4403 | 0.29871799999999998, 4404 | 0.75368299999999999, 4405 | -0.875, 4406 | 0.303869, 4407 | 0.40653499999999998, 4408 | 0.84495900000000002, 4409 | -0.75, 4410 | 0.38301299999999999, 4411 | 0.50941899999999996, 4412 | 0.91738799999999998, 4413 | -0.625, 4414 | 0.466667, 4415 | 0.60456299999999996, 4416 | 0.96815499999999999, 4417 | -0.5, 4418 | 0.55295300000000003, 4419 | 0.68892900000000001, 4420 | 0.99537600000000004, 4421 | -0.375, 4422 | 0.63917599999999997, 4423 | 0.75960000000000005, 4424 | 0.99815100000000001, 4425 | -0.25, 4426 | 0.72219299999999997, 4427 | 0.81395300000000004, 4428 | 0.97657499999999997, 4429 | -0.125, 4430 | 0.79869199999999996, 4431 | 0.84978600000000004, 4432 | 0.93168899999999999, 4433 | 0, 4434 | 0.86539500000000003, 4435 | 0.86541000000000001, 4436 | 0.86539600000000005, 4437 | 0.125, 4438 | 0.92412799999999995, 4439 | 0.82738500000000004, 4440 | 0.77450799999999997, 4441 | 0.25, 4442 | 0.95885299999999996, 4443 | 0.76976800000000001, 4444 | 0.67800800000000006, 4445 | 0.375, 4446 | 0.96995399999999998, 4447 | 0.69426699999999997, 4448 | 0.57937499999999997, 4449 | 0.5, 4450 | 0.95800300000000005, 4451 | 0.60284199999999999, 4452 | 0.48177599999999998, 4453 | 0.625, 4454 | 0.92394500000000002, 4455 | 0.497309, 4456 | 0.38796999999999998, 4457 | 0.75, 4458 | 0.86918700000000004, 4459 | 0.37831300000000001, 4460 | 0.30026700000000001, 4461 | 0.875, 4462 | 0.79563200000000001, 4463 | 0.241284, 4464 | 0.220526, 4465 | 1, 4466 | 0.70567299999999999, 4467 | 0.015556199999999999, 4468 | 0.15023300000000001 4469 | ] 4470 | }, 4471 | { 4472 | "ColorSpace" : "RGB", 4473 | "Name" : "hsv", 4474 | "RGBPoints" : 4475 | [ 4476 | -1, 4477 | 1, 4478 | 0, 4479 | 0, 4480 | -0.66666599999999998, 4481 | 1, 4482 | 0, 4483 | 1, 4484 | -0.33333299999999999, 4485 | 0, 4486 | 0, 4487 | 1, 4488 | 0, 4489 | 0, 4490 | 1, 4491 | 1, 4492 | 0.33333000000000002, 4493 | 0, 4494 | 1, 4495 | 0, 4496 | 0.66666000000000003, 4497 | 1, 4498 | 1, 4499 | 0, 4500 | 1, 4501 | 1, 4502 | 0, 4503 | 0 4504 | ] 4505 | }, 4506 | { 4507 | "ColorSpace" : "Lab", 4508 | "Creator" : "Francesca Samsel", 4509 | "Name" : "Asymmtrical Earth Tones (6_21b)", 4510 | "NanColor" : 4511 | [ 4512 | 0.25, 4513 | 0, 4514 | 0 4515 | ], 4516 | "RGBPoints" : 4517 | [ 4518 | 0, 4519 | 0.141176, 4520 | 0.14902000000000001, 4521 | 0.20000000000000001, 4522 | 0.050000000000000003, 4523 | 0.21568599999999999, 4524 | 0.258824, 4525 | 0.32156899999999999, 4526 | 0.10000000000000001, 4527 | 0.24313699999999999, 4528 | 0.36862699999999998, 4529 | 0.38039200000000001, 4530 | 0.14999999999999999, 4531 | 0.27450999999999998, 4532 | 0.439216, 4533 | 0.40000000000000002, 4534 | 0.20000000000000001, 4535 | 0.32549, 4536 | 0.50196099999999999, 4537 | 0.38431399999999999, 4538 | 0.25, 4539 | 0.403922, 4540 | 0.59999999999999998, 4541 | 0.41960799999999998, 4542 | 0.29999999999999999, 4543 | 0.48627500000000001, 4544 | 0.70196099999999995, 4545 | 0.45490199999999997, 4546 | 0.34999999999999998, 4547 | 0.556863, 4548 | 0.74902000000000002, 4549 | 0.494118, 4550 | 0.40000000000000002, 4551 | 0.67058799999999996, 4552 | 0.80000000000000004, 4553 | 0.54509799999999997, 4554 | 0.5, 4555 | 0.85490200000000005, 4556 | 0.90196100000000001, 4557 | 0.63137299999999996, 4558 | 0.55000000000000004, 4559 | 0.92549000000000003, 4560 | 0.94117600000000001, 4561 | 0.69411800000000001, 4562 | 0.59999999999999998, 4563 | 0.96078399999999997, 4564 | 0.94901999999999997, 4565 | 0.77647100000000002, 4566 | 0.65000000000000002, 4567 | 0.98823499999999997, 4568 | 0.96862700000000002, 4569 | 0.90980399999999995, 4570 | 0.69999999999999996, 4571 | 0.83921599999999996, 4572 | 0.81568600000000002, 4573 | 0.77254900000000004, 4574 | 0.75, 4575 | 0.70196099999999995, 4576 | 0.66274500000000003, 4577 | 0.61568599999999996, 4578 | 0.80000000000000004, 4579 | 0.59999999999999998, 4580 | 0.52941199999999999, 4581 | 0.478431, 4582 | 0.84999999999999998, 4583 | 0.50196099999999999, 4584 | 0.403922, 4585 | 0.36078399999999999, 4586 | 0.90000000000000002, 4587 | 0.439216, 4588 | 0.31372499999999998, 4589 | 0.29019600000000001, 4590 | 1, 4591 | 0.30196099999999998, 4592 | 0.16470599999999999, 4593 | 0.17647099999999999 4594 | ] 4595 | }, 4596 | { 4597 | "ColorSpace" : "Lab", 4598 | "Name" : "gist_earth", 4599 | "RGBPoints" : 4600 | [ 4601 | -1, 4602 | 0, 4603 | 0, 4604 | 0, 4605 | -0.87451000000000001, 4606 | 0.23921600000000001, 4607 | 0.027451, 4608 | 0.415686, 4609 | -0.74902000000000002, 4610 | 0.090196100000000001, 4611 | 0.25490200000000002, 4612 | 0.556863, 4613 | -0.623529, 4614 | 0.094117599999999996, 4615 | 0.352941, 4616 | 0.54901999999999995, 4617 | -0.49803900000000001, 4618 | 0.105882, 4619 | 0.43529400000000001, 4620 | 0.53333299999999995, 4621 | -0.37254900000000002, 4622 | 0.12548999999999999, 4623 | 0.52549000000000001, 4624 | 0.50196099999999999, 4625 | -0.247059, 4626 | 0.156863, 4627 | 0.596078, 4628 | 0.443137, 4629 | -0.121569, 4630 | 0.196078, 4631 | 0.65098, 4632 | 0.38039200000000001, 4633 | 0.0039215700000000001, 4634 | 0.28235300000000002, 4635 | 0.71764700000000003, 4636 | 0.30196099999999998, 4637 | 0.129412, 4638 | 0.466667, 4639 | 0.77254900000000004, 4640 | 0.27450999999999998, 4641 | 0.25490200000000002, 4642 | 0.67843100000000001, 4643 | 0.78431399999999996, 4644 | 0.30980400000000002, 4645 | 0.38039200000000001, 4646 | 0.90196100000000001, 4647 | 0.75686299999999995, 4648 | 0.376471, 4649 | 0.50588200000000005, 4650 | 0.99215699999999996, 4651 | 0.70588200000000001, 4652 | 0.52156899999999995, 4653 | 0.63137299999999996, 4654 | 1, 4655 | 0.72156900000000002, 4656 | 0.70196099999999995, 4657 | 0.75686299999999995, 4658 | 1, 4659 | 0.78431399999999996, 4660 | 0.78431399999999996, 4661 | 0.88235300000000005, 4662 | 1, 4663 | 0.86666699999999997, 4664 | 0.86666699999999997, 4665 | 1, 4666 | 1, 4667 | 1, 4668 | 1 4669 | ] 4670 | } 4671 | ] 4672 | 4673 | -------------------------------------------------------------------------------- /res/hex.vtu: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | wAMAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAADAAAAAAAAAAQAAAAAAAAABQAAAAAAAAAGAAAAAAAAAAcAAAAAAAAACAAAAAAAAAAJAAAAAAAAAAoAAAAAAAAACwAAAAAAAAAMAAAAAAAAAA0AAAAAAAAADgAAAAAAAAAPAAAAAAAAABAAAAAAAAAAEQAAAAAAAAASAAAAAAAAABMAAAAAAAAAFAAAAAAAAAAVAAAAAAAAABYAAAAAAAAAFwAAAAAAAAAYAAAAAAAAABkAAAAAAAAAGgAAAAAAAAAbAAAAAAAAABwAAAAAAAAAHQAAAAAAAAAeAAAAAAAAAB8AAAAAAAAAIAAAAAAAAAAhAAAAAAAAACIAAAAAAAAAIwAAAAAAAAAkAAAAAAAAACUAAAAAAAAAJgAAAAAAAAAnAAAAAAAAACgAAAAAAAAAKQAAAAAAAAAqAAAAAAAAACsAAAAAAAAALAAAAAAAAAAtAAAAAAAAAC4AAAAAAAAALwAAAAAAAAAwAAAAAAAAADEAAAAAAAAAMgAAAAAAAAAzAAAAAAAAADQAAAAAAAAANQAAAAAAAAA2AAAAAAAAADcAAAAAAAAAOAAAAAAAAAA5AAAAAAAAADoAAAAAAAAAOwAAAAAAAAA8AAAAAAAAAD0AAAAAAAAAPgAAAAAAAAA/AAAAAAAAAEAAAAAAAAAAQQAAAAAAAABCAAAAAAAAAEMAAAAAAAAARAAAAAAAAABFAAAAAAAAAEYAAAAAAAAARwAAAAAAAABIAAAAAAAAAEkAAAAAAAAASgAAAAAAAABLAAAAAAAAAEwAAAAAAAAATQAAAAAAAABOAAAAAAAAAE8AAAAAAAAAUAAAAAAAAABRAAAAAAAAAFIAAAAAAAAAUwAAAAAAAABUAAAAAAAAAFUAAAAAAAAAVgAAAAAAAABXAAAAAAAAAFgAAAAAAAAAWQAAAAAAAABaAAAAAAAAAFsAAAAAAAAAXAAAAAAAAABdAAAAAAAAAF4AAAAAAAAAXwAAAAAAAABgAAAAAAAAAGEAAAAAAAAAYgAAAAAAAABjAAAAAAAAAGQAAAAAAAAAZQAAAAAAAABmAAAAAAAAAGcAAAAAAAAAaAAAAAAAAABpAAAAAAAAAGoAAAAAAAAAawAAAAAAAABsAAAAAAAAAG0AAAAAAAAAbgAAAAAAAABvAAAAAAAAAHAAAAAAAAAAcQAAAAAAAAByAAAAAAAAAHMAAAAAAAAAdAAAAAAAAAB1AAAAAAAAAHYAAAAAAAAAdwAAAAAAAAA= 7 | 8 | 9 | QAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAADwPwAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAQAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAIQAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAADwPwAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAIQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAAAAAAAAAAAAAAAADwPwAAAAAAAAhAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAhAAAAAAAAAAAAAAAAAAAAIQAAAAAAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAAAAAAAAAAAAAAAAAAADwPwAAAAAAABBAAAAAAAAAAAAAAAAAAAAAQAAAAAAAABBAAAAAAAAAAAAAAAAAAAAIQAAAAAAAABBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPwAAAAAAAAAAAAAAAAAA8D8AAAAAAAAAQAAAAAAAAAAAAAAAAAAA8D8AAAAAAAAIQAAAAAAAAAAAAAAAAAAA8D8AAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAQAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAIQAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAABAAAAAAAAA8D8AAAAAAADwPwAAAAAAAABAAAAAAAAA8D8AAAAAAAAAQAAAAAAAAABAAAAAAAAA8D8AAAAAAAAIQAAAAAAAAABAAAAAAAAA8D8AAAAAAAAAAAAAAAAAAAhAAAAAAAAA8D8AAAAAAADwPwAAAAAAAAhAAAAAAAAA8D8AAAAAAAAAQAAAAAAAAAhAAAAAAAAA8D8AAAAAAAAIQAAAAAAAAAhAAAAAAAAA8D8AAAAAAAAAAAAAAAAAABBAAAAAAAAA8D8AAAAAAADwPwAAAAAAABBAAAAAAAAA8D8AAAAAAAAAQAAAAAAAABBAAAAAAAAA8D8AAAAAAAAIQAAAAAAAABBAAAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAADwPwAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAIQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAEAAAAAAAADwPwAAAAAAAPA/AAAAAAAAAEAAAAAAAAAAQAAAAAAAAPA/AAAAAAAAAEAAAAAAAAAIQAAAAAAAAPA/AAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAADwPwAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAIQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAhAAAAAAAAAAEAAAAAAAADwPwAAAAAAAAhAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAhAAAAAAAAAAEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAAAEAAAAAAAAAAAAAAAAAAABBAAAAAAAAAAEAAAAAAAADwPwAAAAAAABBAAAAAAAAAAEAAAAAAAAAAQAAAAAAAABBAAAAAAAAAAEAAAAAAAAAIQAAAAAAAABBAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAAAAADwPwAAAAAAAAAAAAAAAAAACEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAAAAAAAAAAACEAAAAAAAAAAAAAAAAAAAPA/AAAAAAAACEAAAAAAAADwPwAAAAAAAPA/AAAAAAAACEAAAAAAAAAAQAAAAAAAAPA/AAAAAAAACEAAAAAAAAAIQAAAAAAAAPA/AAAAAAAACEAAAAAAAAAAAAAAAAAAAABAAAAAAAAACEAAAAAAAADwPwAAAAAAAABAAAAAAAAACEAAAAAAAAAAQAAAAAAAAABAAAAAAAAACEAAAAAAAAAIQAAAAAAAAABAAAAAAAAACEAAAAAAAAAAAAAAAAAAAAhAAAAAAAAACEAAAAAAAADwPwAAAAAAAAhAAAAAAAAACEAAAAAAAAAAQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAAAAAAAAAAABBAAAAAAAAACEAAAAAAAADwPwAAAAAAABBAAAAAAAAACEAAAAAAAAAAQAAAAAAAABBAAAAAAAAACEAAAAAAAAAIQAAAAAAAABBAAAAAAAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAAAAAAAADwPwAAAAAAAAAAAAAAAAAAEEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEEAAAAAAAAAIQAAAAAAAAAAAAAAAAAAAEEAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAEEAAAAAAAADwPwAAAAAAAPA/AAAAAAAAEEAAAAAAAAAAQAAAAAAAAPA/AAAAAAAAEEAAAAAAAAAIQAAAAAAAAPA/AAAAAAAAEEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAEEAAAAAAAADwPwAAAAAAAABAAAAAAAAAEEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAEEAAAAAAAAAIQAAAAAAAAABAAAAAAAAAEEAAAAAAAAAAAAAAAAAAAAhAAAAAAAAAEEAAAAAAAADwPwAAAAAAAAhAAAAAAAAAEEAAAAAAAAAAQAAAAAAAAAhAAAAAAAAAEEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAAEEAAAAAAAAAAAAAAAAAAABBAAAAAAAAAEEAAAAAAAADwPwAAAAAAABBAAAAAAAAAEEAAAAAAAAAAQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAIQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFEAAAAAAAADwPwAAAAAAAAAAAAAAAAAAFEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAFEAAAAAAAAAIQAAAAAAAAAAAAAAAAAAAFEAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAFEAAAAAAAADwPwAAAAAAAPA/AAAAAAAAFEAAAAAAAAAAQAAAAAAAAPA/AAAAAAAAFEAAAAAAAAAIQAAAAAAAAPA/AAAAAAAAFEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAFEAAAAAAAADwPwAAAAAAAABAAAAAAAAAFEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAFEAAAAAAAAAIQAAAAAAAAABAAAAAAAAAFEAAAAAAAAAAAAAAAAAAAAhAAAAAAAAAFEAAAAAAAADwPwAAAAAAAAhAAAAAAAAAFEAAAAAAAAAAQAAAAAAAAAhAAAAAAAAAFEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAAFEAAAAAAAAAAAAAAAAAAABBAAAAAAAAAFEAAAAAAAADwPwAAAAAAABBAAAAAAAAAFEAAAAAAAAAAQAAAAAAAABBAAAAAAAAAFEAAAAAAAAAIQAAAAAAAABBAAAAAAAAAFEA= 10 | 11 | 12 | 0 13 | 14 | 15 | 7.0710678119 16 | 17 | 18 | 19 | 20 | 0 21 | 22 | 23 | 7.0710678119 24 | 25 | 26 | 27 | 28 | 29 | 30 | 4AEAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAADAAAAAAAAAAQAAAAAAAAABQAAAAAAAAAGAAAAAAAAAAcAAAAAAAAACAAAAAAAAAAJAAAAAAAAAAoAAAAAAAAACwAAAAAAAAAMAAAAAAAAAA0AAAAAAAAADgAAAAAAAAAPAAAAAAAAABAAAAAAAAAAEQAAAAAAAAASAAAAAAAAABMAAAAAAAAAFAAAAAAAAAAVAAAAAAAAABYAAAAAAAAAFwAAAAAAAAAYAAAAAAAAABkAAAAAAAAAGgAAAAAAAAAbAAAAAAAAABwAAAAAAAAAHQAAAAAAAAAeAAAAAAAAAB8AAAAAAAAAIAAAAAAAAAAhAAAAAAAAACIAAAAAAAAAIwAAAAAAAAAkAAAAAAAAACUAAAAAAAAAJgAAAAAAAAAnAAAAAAAAACgAAAAAAAAAKQAAAAAAAAAqAAAAAAAAACsAAAAAAAAALAAAAAAAAAAtAAAAAAAAAC4AAAAAAAAALwAAAAAAAAAwAAAAAAAAADEAAAAAAAAAMgAAAAAAAAAzAAAAAAAAADQAAAAAAAAANQAAAAAAAAA2AAAAAAAAADcAAAAAAAAAOAAAAAAAAAA5AAAAAAAAADoAAAAAAAAAOwAAAAAAAAA= 31 | 32 | 33 | 34 | 35 | oAUAAAAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAABAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAACAPwAAAAAAAIA/AACAPwAAAAAAAABAAACAPwAAAAAAAEBAAACAPwAAAAAAAAAAAAAAQAAAAAAAAIA/AAAAQAAAAAAAAABAAAAAQAAAAAAAAEBAAAAAQAAAAAAAAAAAAABAQAAAAAAAAIA/AABAQAAAAAAAAABAAABAQAAAAAAAAEBAAABAQAAAAAAAAAAAAACAQAAAAAAAAIA/AACAQAAAAAAAAABAAACAQAAAAAAAAEBAAACAQAAAAAAAAAAAAAAAAAAAgD8AAIA/AAAAAAAAgD8AAABAAAAAAAAAgD8AAEBAAAAAAAAAgD8AAAAAAACAPwAAgD8AAIA/AACAPwAAgD8AAABAAACAPwAAgD8AAEBAAACAPwAAgD8AAAAAAAAAQAAAgD8AAIA/AAAAQAAAgD8AAABAAAAAQAAAgD8AAEBAAAAAQAAAgD8AAAAAAABAQAAAgD8AAIA/AABAQAAAgD8AAABAAABAQAAAgD8AAEBAAABAQAAAgD8AAAAAAACAQAAAgD8AAIA/AACAQAAAgD8AAABAAACAQAAAgD8AAEBAAACAQAAAgD8AAAAAAAAAAAAAAEAAAIA/AAAAAAAAAEAAAABAAAAAAAAAAEAAAEBAAAAAAAAAAEAAAAAAAACAPwAAAEAAAIA/AACAPwAAAEAAAABAAACAPwAAAEAAAEBAAACAPwAAAEAAAAAAAAAAQAAAAEAAAIA/AAAAQAAAAEAAAABAAAAAQAAAAEAAAEBAAAAAQAAAAEAAAAAAAABAQAAAAEAAAIA/AABAQAAAAEAAAABAAABAQAAAAEAAAEBAAABAQAAAAEAAAAAAAACAQAAAAEAAAIA/AACAQAAAAEAAAABAAACAQAAAAEAAAEBAAACAQAAAAEAAAAAAAAAAAAAAQEAAAIA/AAAAAAAAQEAAAABAAAAAAAAAQEAAAEBAAAAAAAAAQEAAAAAAAACAPwAAQEAAAIA/AACAPwAAQEAAAABAAACAPwAAQEAAAEBAAACAPwAAQEAAAAAAAAAAQAAAQEAAAIA/AAAAQAAAQEAAAABAAAAAQAAAQEAAAEBAAAAAQAAAQEAAAAAAAABAQAAAQEAAAIA/AABAQAAAQEAAAABAAABAQAAAQEAAAEBAAABAQAAAQEAAAAAAAACAQAAAQEAAAIA/AACAQAAAQEAAAABAAACAQAAAQEAAAEBAAACAQAAAQEAAAAAAAAAAAAAAgEAAAIA/AAAAAAAAgEAAAABAAAAAAAAAgEAAAEBAAAAAAAAAgEAAAAAAAACAPwAAgEAAAIA/AACAPwAAgEAAAABAAACAPwAAgEAAAEBAAACAPwAAgEAAAAAAAAAAQAAAgEAAAIA/AAAAQAAAgEAAAABAAAAAQAAAgEAAAEBAAAAAQAAAgEAAAAAAAABAQAAAgEAAAIA/AABAQAAAgEAAAABAAABAQAAAgEAAAEBAAABAQAAAgEAAAAAAAACAQAAAgEAAAIA/AACAQAAAgEAAAABAAACAQAAAgEAAAEBAAACAQAAAgEAAAAAAAAAAAAAAoEAAAIA/AAAAAAAAoEAAAABAAAAAAAAAoEAAAEBAAAAAAAAAoEAAAAAAAACAPwAAoEAAAIA/AACAPwAAoEAAAABAAACAPwAAoEAAAEBAAACAPwAAoEAAAAAAAAAAQAAAoEAAAIA/AAAAQAAAoEAAAABAAAAAQAAAoEAAAEBAAAAAQAAAoEAAAAAAAABAQAAAoEAAAIA/AABAQAAAoEAAAABAAABAQAAAoEAAAEBAAABAQAAAoEAAAAAAAACAQAAAoEAAAIA/AACAQAAAoEAAAABAAACAQAAAoEAAAEBAAACAQAAAoEA= 36 | 37 | 38 | 0 39 | 40 | 41 | 7.0710678119 42 | 43 | 44 | 45 | 46 | 0 47 | 48 | 49 | 7.0710678119 50 | 51 | 52 | 53 | 54 | 55 | 56 | AA8AAAAAAAAAAAAAAAAAAAEAAAAAAAAABQAAAAAAAAAEAAAAAAAAABQAAAAAAAAAFQAAAAAAAAAZAAAAAAAAABgAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAYAAAAAAAAABQAAAAAAAAAVAAAAAAAAABYAAAAAAAAAGgAAAAAAAAAZAAAAAAAAAAIAAAAAAAAAAwAAAAAAAAAHAAAAAAAAAAYAAAAAAAAAFgAAAAAAAAAXAAAAAAAAABsAAAAAAAAAGgAAAAAAAAAEAAAAAAAAAAUAAAAAAAAACQAAAAAAAAAIAAAAAAAAABgAAAAAAAAAGQAAAAAAAAAdAAAAAAAAABwAAAAAAAAABQAAAAAAAAAGAAAAAAAAAAoAAAAAAAAACQAAAAAAAAAZAAAAAAAAABoAAAAAAAAAHgAAAAAAAAAdAAAAAAAAAAYAAAAAAAAABwAAAAAAAAALAAAAAAAAAAoAAAAAAAAAGgAAAAAAAAAbAAAAAAAAAB8AAAAAAAAAHgAAAAAAAAAIAAAAAAAAAAkAAAAAAAAADQAAAAAAAAAMAAAAAAAAABwAAAAAAAAAHQAAAAAAAAAhAAAAAAAAACAAAAAAAAAACQAAAAAAAAAKAAAAAAAAAA4AAAAAAAAADQAAAAAAAAAdAAAAAAAAAB4AAAAAAAAAIgAAAAAAAAAhAAAAAAAAAAoAAAAAAAAACwAAAAAAAAAPAAAAAAAAAA4AAAAAAAAAHgAAAAAAAAAfAAAAAAAAACMAAAAAAAAAIgAAAAAAAAAMAAAAAAAAAA0AAAAAAAAAEQAAAAAAAAAQAAAAAAAAACAAAAAAAAAAIQAAAAAAAAAlAAAAAAAAACQAAAAAAAAADQAAAAAAAAAOAAAAAAAAABIAAAAAAAAAEQAAAAAAAAAhAAAAAAAAACIAAAAAAAAAJgAAAAAAAAAlAAAAAAAAAA4AAAAAAAAADwAAAAAAAAATAAAAAAAAABIAAAAAAAAAIgAAAAAAAAAjAAAAAAAAACcAAAAAAAAAJgAAAAAAAAAUAAAAAAAAABUAAAAAAAAAGQAAAAAAAAAYAAAAAAAAACgAAAAAAAAAKQAAAAAAAAAtAAAAAAAAACwAAAAAAAAAFQAAAAAAAAAWAAAAAAAAABoAAAAAAAAAGQAAAAAAAAApAAAAAAAAACoAAAAAAAAALgAAAAAAAAAtAAAAAAAAABYAAAAAAAAAFwAAAAAAAAAbAAAAAAAAABoAAAAAAAAAKgAAAAAAAAArAAAAAAAAAC8AAAAAAAAALgAAAAAAAAAYAAAAAAAAABkAAAAAAAAAHQAAAAAAAAAcAAAAAAAAACwAAAAAAAAALQAAAAAAAAAxAAAAAAAAADAAAAAAAAAAGQAAAAAAAAAaAAAAAAAAAB4AAAAAAAAAHQAAAAAAAAAtAAAAAAAAAC4AAAAAAAAAMgAAAAAAAAAxAAAAAAAAABoAAAAAAAAAGwAAAAAAAAAfAAAAAAAAAB4AAAAAAAAALgAAAAAAAAAvAAAAAAAAADMAAAAAAAAAMgAAAAAAAAAcAAAAAAAAAB0AAAAAAAAAIQAAAAAAAAAgAAAAAAAAADAAAAAAAAAAMQAAAAAAAAA1AAAAAAAAADQAAAAAAAAAHQAAAAAAAAAeAAAAAAAAACIAAAAAAAAAIQAAAAAAAAAxAAAAAAAAADIAAAAAAAAANgAAAAAAAAA1AAAAAAAAAB4AAAAAAAAAHwAAAAAAAAAjAAAAAAAAACIAAAAAAAAAMgAAAAAAAAAzAAAAAAAAADcAAAAAAAAANgAAAAAAAAAgAAAAAAAAACEAAAAAAAAAJQAAAAAAAAAkAAAAAAAAADQAAAAAAAAANQAAAAAAAAA5AAAAAAAAADgAAAAAAAAAIQAAAAAAAAAiAAAAAAAAACYAAAAAAAAAJQAAAAAAAAA1AAAAAAAAADYAAAAAAAAAOgAAAAAAAAA5AAAAAAAAACIAAAAAAAAAIwAAAAAAAAAnAAAAAAAAACYAAAAAAAAANgAAAAAAAAA3AAAAAAAAADsAAAAAAAAAOgAAAAAAAAAoAAAAAAAAACkAAAAAAAAALQAAAAAAAAAsAAAAAAAAADwAAAAAAAAAPQAAAAAAAABBAAAAAAAAAEAAAAAAAAAAKQAAAAAAAAAqAAAAAAAAAC4AAAAAAAAALQAAAAAAAAA9AAAAAAAAAD4AAAAAAAAAQgAAAAAAAABBAAAAAAAAACoAAAAAAAAAKwAAAAAAAAAvAAAAAAAAAC4AAAAAAAAAPgAAAAAAAAA/AAAAAAAAAEMAAAAAAAAAQgAAAAAAAAAsAAAAAAAAAC0AAAAAAAAAMQAAAAAAAAAwAAAAAAAAAEAAAAAAAAAAQQAAAAAAAABFAAAAAAAAAEQAAAAAAAAALQAAAAAAAAAuAAAAAAAAADIAAAAAAAAAMQAAAAAAAABBAAAAAAAAAEIAAAAAAAAARgAAAAAAAABFAAAAAAAAAC4AAAAAAAAALwAAAAAAAAAzAAAAAAAAADIAAAAAAAAAQgAAAAAAAABDAAAAAAAAAEcAAAAAAAAARgAAAAAAAAAwAAAAAAAAADEAAAAAAAAANQAAAAAAAAA0AAAAAAAAAEQAAAAAAAAARQAAAAAAAABJAAAAAAAAAEgAAAAAAAAAMQAAAAAAAAAyAAAAAAAAADYAAAAAAAAANQAAAAAAAABFAAAAAAAAAEYAAAAAAAAASgAAAAAAAABJAAAAAAAAADIAAAAAAAAAMwAAAAAAAAA3AAAAAAAAADYAAAAAAAAARgAAAAAAAABHAAAAAAAAAEsAAAAAAAAASgAAAAAAAAA0AAAAAAAAADUAAAAAAAAAOQAAAAAAAAA4AAAAAAAAAEgAAAAAAAAASQAAAAAAAABNAAAAAAAAAEwAAAAAAAAANQAAAAAAAAA2AAAAAAAAADoAAAAAAAAAOQAAAAAAAABJAAAAAAAAAEoAAAAAAAAATgAAAAAAAABNAAAAAAAAADYAAAAAAAAANwAAAAAAAAA7AAAAAAAAADoAAAAAAAAASgAAAAAAAABLAAAAAAAAAE8AAAAAAAAATgAAAAAAAAA8AAAAAAAAAD0AAAAAAAAAQQAAAAAAAABAAAAAAAAAAFAAAAAAAAAAUQAAAAAAAABVAAAAAAAAAFQAAAAAAAAAPQAAAAAAAAA+AAAAAAAAAEIAAAAAAAAAQQAAAAAAAABRAAAAAAAAAFIAAAAAAAAAVgAAAAAAAABVAAAAAAAAAD4AAAAAAAAAPwAAAAAAAABDAAAAAAAAAEIAAAAAAAAAUgAAAAAAAABTAAAAAAAAAFcAAAAAAAAAVgAAAAAAAABAAAAAAAAAAEEAAAAAAAAARQAAAAAAAABEAAAAAAAAAFQAAAAAAAAAVQAAAAAAAABZAAAAAAAAAFgAAAAAAAAAQQAAAAAAAABCAAAAAAAAAEYAAAAAAAAARQAAAAAAAABVAAAAAAAAAFYAAAAAAAAAWgAAAAAAAABZAAAAAAAAAEIAAAAAAAAAQwAAAAAAAABHAAAAAAAAAEYAAAAAAAAAVgAAAAAAAABXAAAAAAAAAFsAAAAAAAAAWgAAAAAAAABEAAAAAAAAAEUAAAAAAAAASQAAAAAAAABIAAAAAAAAAFgAAAAAAAAAWQAAAAAAAABdAAAAAAAAAFwAAAAAAAAARQAAAAAAAABGAAAAAAAAAEoAAAAAAAAASQAAAAAAAABZAAAAAAAAAFoAAAAAAAAAXgAAAAAAAABdAAAAAAAAAEYAAAAAAAAARwAAAAAAAABLAAAAAAAAAEoAAAAAAAAAWgAAAAAAAABbAAAAAAAAAF8AAAAAAAAAXgAAAAAAAABIAAAAAAAAAEkAAAAAAAAATQAAAAAAAABMAAAAAAAAAFwAAAAAAAAAXQAAAAAAAABhAAAAAAAAAGAAAAAAAAAASQAAAAAAAABKAAAAAAAAAE4AAAAAAAAATQAAAAAAAABdAAAAAAAAAF4AAAAAAAAAYgAAAAAAAABhAAAAAAAAAEoAAAAAAAAASwAAAAAAAABPAAAAAAAAAE4AAAAAAAAAXgAAAAAAAABfAAAAAAAAAGMAAAAAAAAAYgAAAAAAAABQAAAAAAAAAFEAAAAAAAAAVQAAAAAAAABUAAAAAAAAAGQAAAAAAAAAZQAAAAAAAABpAAAAAAAAAGgAAAAAAAAAUQAAAAAAAABSAAAAAAAAAFYAAAAAAAAAVQAAAAAAAABlAAAAAAAAAGYAAAAAAAAAagAAAAAAAABpAAAAAAAAAFIAAAAAAAAAUwAAAAAAAABXAAAAAAAAAFYAAAAAAAAAZgAAAAAAAABnAAAAAAAAAGsAAAAAAAAAagAAAAAAAABUAAAAAAAAAFUAAAAAAAAAWQAAAAAAAABYAAAAAAAAAGgAAAAAAAAAaQAAAAAAAABtAAAAAAAAAGwAAAAAAAAAVQAAAAAAAABWAAAAAAAAAFoAAAAAAAAAWQAAAAAAAABpAAAAAAAAAGoAAAAAAAAAbgAAAAAAAABtAAAAAAAAAFYAAAAAAAAAVwAAAAAAAABbAAAAAAAAAFoAAAAAAAAAagAAAAAAAABrAAAAAAAAAG8AAAAAAAAAbgAAAAAAAABYAAAAAAAAAFkAAAAAAAAAXQAAAAAAAABcAAAAAAAAAGwAAAAAAAAAbQAAAAAAAABxAAAAAAAAAHAAAAAAAAAAWQAAAAAAAABaAAAAAAAAAF4AAAAAAAAAXQAAAAAAAABtAAAAAAAAAG4AAAAAAAAAcgAAAAAAAABxAAAAAAAAAFoAAAAAAAAAWwAAAAAAAABfAAAAAAAAAF4AAAAAAAAAbgAAAAAAAABvAAAAAAAAAHMAAAAAAAAAcgAAAAAAAABcAAAAAAAAAF0AAAAAAAAAYQAAAAAAAABgAAAAAAAAAHAAAAAAAAAAcQAAAAAAAAB1AAAAAAAAAHQAAAAAAAAAXQAAAAAAAABeAAAAAAAAAGIAAAAAAAAAYQAAAAAAAABxAAAAAAAAAHIAAAAAAAAAdgAAAAAAAAB1AAAAAAAAAF4AAAAAAAAAXwAAAAAAAABjAAAAAAAAAGIAAAAAAAAAcgAAAAAAAABzAAAAAAAAAHcAAAAAAAAAdgAAAAAAAAA= 57 | 58 | 59 | 4AEAAAAAAAAIAAAAAAAAABAAAAAAAAAAGAAAAAAAAAAgAAAAAAAAACgAAAAAAAAAMAAAAAAAAAA4AAAAAAAAAEAAAAAAAAAASAAAAAAAAABQAAAAAAAAAFgAAAAAAAAAYAAAAAAAAABoAAAAAAAAAHAAAAAAAAAAeAAAAAAAAACAAAAAAAAAAIgAAAAAAAAAkAAAAAAAAACYAAAAAAAAAKAAAAAAAAAAqAAAAAAAAACwAAAAAAAAALgAAAAAAAAAwAAAAAAAAADIAAAAAAAAANAAAAAAAAAA2AAAAAAAAADgAAAAAAAAAOgAAAAAAAAA8AAAAAAAAAD4AAAAAAAAAAABAAAAAAAACAEAAAAAAAAQAQAAAAAAABgBAAAAAAAAIAEAAAAAAAAoAQAAAAAAADABAAAAAAAAOAEAAAAAAABAAQAAAAAAAEgBAAAAAAAAUAEAAAAAAABYAQAAAAAAAGABAAAAAAAAaAEAAAAAAABwAQAAAAAAAHgBAAAAAAAAgAEAAAAAAACIAQAAAAAAAJABAAAAAAAAmAEAAAAAAACgAQAAAAAAAKgBAAAAAAAAsAEAAAAAAAC4AQAAAAAAAMABAAAAAAAAyAEAAAAAAADQAQAAAAAAANgBAAAAAAAA4AEAAAAAAAA= 60 | 61 | 62 | PAAAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw= 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /res/ico-tensor.vtu: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 0.5236067771911621 0.970820426940918 0.970820426940918 0.5236067771911621 1.24721360206604 -0.37082037329673767 7 | 0.3527863919734955 -0.37082037329673767 0.0763932466506958 0.0763932466506958 1 -1 8 | 9 | 10 | 0.27639320492744446 0.8506507873535156 0.4472135901451111 -0.7236068248748779 0.525731086730957 0.4472135901451111 11 | -0.7236068248748779 -0.525731086730957 0.4472135901451111 0.27639320492744446 -0.8506507873535156 0.4472135901451111 12 | 0.8944271802902222 -2.1907150604527891e-16 0.4472135901451111 -0.27639320492744446 0.8506507873535156 -0.4472135901451111 13 | -0.8944271802902222 1.0953570008308025e-16 -0.4472135901451111 -0.27639320492744446 -0.8506507873535156 -0.4472135901451111 14 | 0.7236068248748779 -0.525731086730957 -0.4472135901451111 0.7236068248748779 0.525731086730957 -0.4472135901451111 15 | 0 0 1 1.2246469849340659e-16 0 -1 16 | 17 | 18 | 0.99999998048 19 | 20 | 21 | 1.0000000039 22 | 23 | 24 | 25 | 26 | 0.99999998048 27 | 28 | 29 | 1.0000000039 30 | 31 | 32 | 33 | 34 | 0.7815737874609694 -0.10514622217782077 -0.05527864415733432 -0.10514622217782081 0.4921310627633197 -0.17013016532953515 35 | -0.0552786441573342 -0.1701301653295352 0.726295149775711 0.5815737879336998 0.17013016095272765 0.14472134843873524 36 | 0.17013016095272765 0.6921310640523778 -0.10514622146777175 0.14472134843873524 -0.10514622146777179 0.7262951480139225 37 | 0.5815737879336998 -0.17013016095272762 0.14472134843873524 -0.17013016095272762 0.6921310640523778 0.10514622146777175 38 | 0.14472134843873521 0.10514622146777178 0.7262951480139225 0.7815737874609694 0.10514622217782085 -0.05527864415733417 39 | 0.10514622217782085 0.4921310627633197 0.1701301653295352 -0.05527864415733417 0.1701301653295352 0.7262951497757109 40 | 0.45796698580811857 7.771561172376095e-17 -0.17888545208352405 4.4408920985006264e-17 0.8157378639923423 5.551115123125783e-17 41 | -0.17888545208352397 0 0.7262951501995392 0.7815737874609694 0.10514622217782088 -0.05527864415733423 42 | 0.10514622217782088 0.49213106276331986 0.17013016532953523 -0.055278644157334175 0.17013016532953523 0.726295149775711 43 | 0.45796698580811857 5.551115123125783e-17 -0.17888545208352397 2.2204460492503132e-17 0.8157378639923424 2.2204460492503132e-17 44 | -0.17888545208352397 8.326672684688674e-18 0.7262951501995392 0.7815737874609694 -0.10514622217782084 -0.05527864415733421 45 | -0.10514622217782084 0.4921310627633198 -0.17013016532953518 -0.05527864415733419 -0.17013016532953523 0.726295149775711 46 | 0.5815737879336998 0.17013016095272765 0.14472134843873521 0.17013016095272762 0.6921310640523777 -0.10514622146777178 47 | 0.14472134843873524 -0.10514622146777179 0.7262951480139225 0.5815737879336997 -0.17013016095272762 0.14472134843873516 48 | -0.17013016095272757 0.6921310640523777 0.10514622146777183 0.14472134843873524 0.10514622146777179 0.7262951480139226 49 | 0.8157378649827638 3.3306690738754695e-17 -1.8048941508030936e-9 1.1102230246251566e-17 0.8157378572042615 2.2204460492503132e-17 50 | -1.804894123047518e-9 1.1102230246251566e-17 0.3685242778129746 0.8157378649827638 2.2204460492503132e-17 -1.8048941452519784e-9 51 | 1.1102230246251566e-17 0.815737857204262 4.4408920985006264e-17 -1.8048941008430575e-9 2.2204460492503132e-17 0.3685242778129746 52 | 53 | 54 | 1.2110601385 55 | 56 | 57 | 1.2110601463 58 | 59 | 60 | 61 | 62 | 1.2110601385 63 | 64 | 65 | 1.2110601463 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 0.27639320492744446 0.8506507873535156 0.4472135901451111 -0.7236068248748779 0.525731086730957 0.4472135901451111 75 | -0.7236068248748779 -0.525731086730957 0.4472135901451111 0.27639320492744446 -0.8506507873535156 0.4472135901451111 76 | 0.8944271802902222 -2.1907150604527891e-16 0.4472135901451111 -0.27639320492744446 0.8506507873535156 -0.4472135901451111 77 | -0.8944271802902222 1.0953570008308025e-16 -0.4472135901451111 -0.27639320492744446 -0.8506507873535156 -0.4472135901451111 78 | 0.7236068248748779 -0.525731086730957 -0.4472135901451111 0.7236068248748779 0.525731086730957 -0.4472135901451111 79 | 0 0 1 1.2246469849340659e-16 0 -1 80 | 81 | 82 | 0.99999998048 83 | 84 | 85 | 1.0000000039 86 | 87 | 88 | 89 | 90 | 0.99999998048 91 | 92 | 93 | 1.0000000039 94 | 95 | 96 | 97 | 98 | 99 | 100 | 0 1 10 1 2 10 101 | 2 3 10 3 4 10 102 | 4 0 10 1 0 5 103 | 2 1 6 3 2 7 104 | 4 3 8 0 4 9 105 | 5 6 1 6 7 2 106 | 7 8 3 8 9 4 107 | 9 5 0 6 5 11 108 | 7 6 11 8 7 11 109 | 9 8 11 5 9 11 110 | 111 | 112 | 3 6 9 12 15 18 113 | 21 24 27 30 33 36 114 | 39 42 45 48 51 54 115 | 57 60 116 | 117 | 118 | 5 5 5 5 5 5 119 | 5 5 5 5 5 5 120 | 5 5 5 5 5 5 121 | 5 5 122 | 123 | 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /res/ico.vtu: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | MAAAAAAAAAAYCwY/sId4P7CHeD8YCwY/sqSfPyvcvb5roLQ+K9y9vhB0nD0QdJw9AACAPwAAgL8= 7 | 8 | 9 | 10 | 11 | 12 | 13 | kAAAAAAAAABpg40+QMRZPy755D5MPjm/UJYGPy755D5MPjm/UJYGvy755D5pg40+QMRZvy755D4u+WQ/f5J8pS755D5pg42+QMRZPy755L4u+WS/d5L8JC755L5pg42+QMRZvy755L5MPjk/UJYGvy755L5MPjk/UJYGPy755L4AAAAAAAAAAAAAgD8zMQ0lAAAAAAAAgL8= 14 | 15 | 16 | 0.99999998048 17 | 18 | 19 | 1.0000000039 20 | 21 | 22 | 23 | 24 | 0.99999998048 25 | 26 | 27 | 1.0000000039 28 | 29 | 30 | 31 | 32 | 33 | 34 | 4AEAAAAAAAAAAAAAAAAAAAEAAAAAAAAACgAAAAAAAAABAAAAAAAAAAIAAAAAAAAACgAAAAAAAAACAAAAAAAAAAMAAAAAAAAACgAAAAAAAAADAAAAAAAAAAQAAAAAAAAACgAAAAAAAAAEAAAAAAAAAAAAAAAAAAAACgAAAAAAAAABAAAAAAAAAAAAAAAAAAAABQAAAAAAAAACAAAAAAAAAAEAAAAAAAAABgAAAAAAAAADAAAAAAAAAAIAAAAAAAAABwAAAAAAAAAEAAAAAAAAAAMAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAACQAAAAAAAAAFAAAAAAAAAAYAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAcAAAAAAAAAAgAAAAAAAAAHAAAAAAAAAAgAAAAAAAAAAwAAAAAAAAAIAAAAAAAAAAkAAAAAAAAABAAAAAAAAAAJAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAUAAAAAAAAACwAAAAAAAAAHAAAAAAAAAAYAAAAAAAAACwAAAAAAAAAIAAAAAAAAAAcAAAAAAAAACwAAAAAAAAAJAAAAAAAAAAgAAAAAAAAACwAAAAAAAAAFAAAAAAAAAAkAAAAAAAAACwAAAAAAAAA= 35 | 36 | 37 | oAAAAAAAAAADAAAAAAAAAAYAAAAAAAAACQAAAAAAAAAMAAAAAAAAAA8AAAAAAAAAEgAAAAAAAAAVAAAAAAAAABgAAAAAAAAAGwAAAAAAAAAeAAAAAAAAACEAAAAAAAAAJAAAAAAAAAAnAAAAAAAAACoAAAAAAAAALQAAAAAAAAAwAAAAAAAAADMAAAAAAAAANgAAAAAAAAA5AAAAAAAAADwAAAAAAAAA 38 | 39 | 40 | FAAAAAAAAAAFBQUFBQUFBQUFBQUFBQUFBQUFBQ== 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /res/ico64.vtu: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | YAAAAAAAAACICPUIY8HgPwDSHAD2EO8/ANIcAPYQ7z+ICPUIY8HgP0BEqDeW9PM/8O4VboW7178AEaFeDZTWP/DuFW6Fu9e/AJDmAIKOsz8AkOYAgo6zPwAAAAAAAPA/AAAAAAAA8L8= 7 | 8 | 9 | 10 | 11 | 12 | 13 | kAAAAAAAAABpg40+QMRZPy755D5MPjm/UJYGPy755D5MPjm/UJYGvy755D5pg40+QMRZvy755D4u+WQ/f5J8pS755D5pg42+QMRZPy755L4u+WS/d5L8JC755L5pg42+QMRZvy755L5MPjk/UJYGvy755L5MPjk/UJYGPy755L4AAAAAAAAAAAAAgD8zMQ0lAAAAAAAAgL8= 14 | 15 | 16 | 0.99999998048 17 | 18 | 19 | 1.0000000039 20 | 21 | 22 | 23 | 24 | 0.99999998048 25 | 26 | 27 | 1.0000000039 28 | 29 | 30 | 31 | 32 | 33 | 34 | 4AEAAAAAAAAAAAAAAAAAAAEAAAAAAAAACgAAAAAAAAABAAAAAAAAAAIAAAAAAAAACgAAAAAAAAACAAAAAAAAAAMAAAAAAAAACgAAAAAAAAADAAAAAAAAAAQAAAAAAAAACgAAAAAAAAAEAAAAAAAAAAAAAAAAAAAACgAAAAAAAAABAAAAAAAAAAAAAAAAAAAABQAAAAAAAAACAAAAAAAAAAEAAAAAAAAABgAAAAAAAAADAAAAAAAAAAIAAAAAAAAABwAAAAAAAAAEAAAAAAAAAAMAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAACQAAAAAAAAAFAAAAAAAAAAYAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAcAAAAAAAAAAgAAAAAAAAAHAAAAAAAAAAgAAAAAAAAAAwAAAAAAAAAIAAAAAAAAAAkAAAAAAAAABAAAAAAAAAAJAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAUAAAAAAAAACwAAAAAAAAAHAAAAAAAAAAYAAAAAAAAACwAAAAAAAAAIAAAAAAAAAAcAAAAAAAAACwAAAAAAAAAJAAAAAAAAAAgAAAAAAAAACwAAAAAAAAAFAAAAAAAAAAkAAAAAAAAACwAAAAAAAAA= 35 | 36 | 37 | oAAAAAAAAAADAAAAAAAAAAYAAAAAAAAACQAAAAAAAAAMAAAAAAAAAA8AAAAAAAAAEgAAAAAAAAAVAAAAAAAAABgAAAAAAAAAGwAAAAAAAAAeAAAAAAAAACEAAAAAAAAAJAAAAAAAAAAnAAAAAAAAACoAAAAAAAAALQAAAAAAAAAwAAAAAAAAADMAAAAAAAAANgAAAAAAAAA5AAAAAAAAADwAAAAAAAAA 38 | 39 | 40 | FAAAAAAAAAAFBQUFBQUFBQUFBQUFBQUFBQUFBQ== 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /res/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffIrwin/skillet/31652683b365dce59427268d2e4c3c310f08001c/res/icon.png -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # VTK filename to be visualized 4 | f=./res/teapot.vtu 5 | 6 | ## A vector result can be created in ParaView with Calculator -> coords. Then 7 | ## a tensor result can be created with Python calculator -> gradient(MyVector). 8 | ## 9 | ## Ref: 10 | ## https://vtk.org/Wiki/Python_Calculator#A_more_complex_example 11 | ## 12 | #f=./res/ico-tensor.vtu 13 | 14 | #f=./res/ico64.vtu 15 | #f=./res/ico.vtu 16 | # 17 | #f=./scratch/rbc-sinx.vtu 18 | # 19 | ## Legacy doesn't work? 20 | #f=./scratch/teapot.vtk 21 | #f=./scratch/teapot-ascii.vtk 22 | #f=./scratch/cube.vtk 23 | # 24 | ## polydata with texture coords 25 | #f=./scratch/fran_cut.vtk 26 | # 27 | #f=./scratch/a.vtu 28 | 29 | #======================================================================= 30 | 31 | cargo run "$f" 32 | 33 | -------------------------------------------------------------------------------- /src/app.rs: -------------------------------------------------------------------------------- 1 | 2 | //============================================================================== 3 | 4 | use std::io::Cursor; 5 | use std::ops::Deref; 6 | use std::rc::Rc; 7 | 8 | //**************** 9 | 10 | // This crate, included in lib 11 | use skillet::*; 12 | use crate::colormaps::*; 13 | use crate::consts::*; 14 | use crate::math::*; 15 | use crate::model::*; 16 | use crate::utils; 17 | 18 | // Not included in lib 19 | use crate::background::Background; 20 | 21 | //**************** 22 | // 3P(s) 23 | //**************** 24 | 25 | use glium:: 26 | { 27 | glutin, 28 | glutin::event, 29 | glutin::event_loop::EventLoopWindowTarget, 30 | Surface 31 | }; 32 | 33 | //============================================================================== 34 | 35 | pub struct State 36 | { 37 | // This is the global app state 38 | 39 | // Modifier keys 40 | pub ctrl : bool, 41 | pub shift: bool, 42 | 43 | // Mouse button states 44 | pub lmb: bool, 45 | pub mmb: bool, 46 | pub rmb: bool, 47 | 48 | // This is where transformations happen 49 | pub world: [[f32; NM]; NM], 50 | 51 | pub view : [[f32; NM]; NM], 52 | 53 | pub cen: [f32; ND], 54 | pub eye: [f32; ND], 55 | 56 | // Mouse position from last frame 57 | pub x0: f32, 58 | pub y0: f32, 59 | 60 | // Scroll wheel zoom factor 61 | pub scale_cum: f32, 62 | 63 | // Colormap index in JSON res file 64 | pub map_index: usize, 65 | 66 | pub colormap: glium::texture::SrgbTexture1d, 67 | 68 | pub diam: f32, 69 | pub display_diam: f32, 70 | 71 | pub bg: Background, 72 | 73 | pub face_program: glium::Program, 74 | pub edge_program: glium::Program, 75 | 76 | // Reference to RenderModel 77 | pub rm: Box, 78 | 79 | pub display: Rc, 80 | } 81 | 82 | //**************** 83 | 84 | impl State 85 | { 86 | pub fn new(rm: Box, display: Rc) -> State 87 | { 88 | let mut cmi = 0; 89 | 90 | // Get point xyz bounds 91 | let (xmin, xmax) = utils::get_bounds(&(rm.m.points.iter().skip(0) 92 | .step_by(ND).copied().collect::>())); 93 | 94 | let (ymin, ymax) = utils::get_bounds(&(rm.m.points.iter().skip(1) 95 | .step_by(ND).copied().collect::>())); 96 | 97 | let (zmin, zmax) = utils::get_bounds(&(rm.m.points.iter().skip(2) 98 | .step_by(ND).copied().collect::>())); 99 | 100 | let xc = 0.5 * (xmin + xmax); 101 | let yc = 0.5 * (ymin + ymax); 102 | let zc = 0.5 * (zmin + zmax); 103 | 104 | println!("x in [{}, {}]", utils::ff32(xmin), utils::ff32(xmax)); 105 | println!("y in [{}, {}]", utils::ff32(ymin), utils::ff32(ymax)); 106 | println!("z in [{}, {}]", utils::ff32(zmin), utils::ff32(zmax)); 107 | println!(); 108 | 109 | let mut cen = [xc, yc, zc]; 110 | 111 | let diam = norm(&sub(&[xmax, ymax, zmax], &[xmin, ymin, zmin])); 112 | 113 | // View must be initialized like this, because subsequent rotations are 114 | // performed about its fixed coordinate system. Set eye from model bounds. 115 | // You could do some trig here on fov to guarantee whole model is in view, 116 | // but it's pretty close as is except for possible extreme cases 117 | 118 | let eye = [0.0, 0.0, zmax + diam]; 119 | 120 | // Initial pan to center 121 | let mut world = identity_matrix(); 122 | world = translate_matrix(&world, &neg(&cen)); 123 | cen = [0.0; ND]; 124 | 125 | State 126 | { 127 | ctrl : false, 128 | shift: false, 129 | 130 | lmb: false, 131 | mmb: false, 132 | rmb: false, 133 | 134 | world: world, 135 | view : view_matrix(&eye, &DIR, &UP), 136 | 137 | cen: cen, 138 | eye: eye, 139 | 140 | x0: 0.0, 141 | y0: 0.0, 142 | 143 | scale_cum: 1.0, 144 | 145 | colormap: get_colormap(&mut cmi, &display), 146 | map_index: cmi, 147 | 148 | // This initial value doesn't matter. It will get set correctly 149 | // after the first frame 150 | display_diam: 1920.0, 151 | diam: diam, 152 | 153 | bg: Background::new(rm.facade.deref()), 154 | 155 | face_program: shaders::face(rm.facade.deref()), 156 | edge_program: shaders::edge(rm.facade.deref()), 157 | 158 | rm: rm, 159 | display: display, 160 | } 161 | } 162 | } 163 | 164 | // View constants 165 | pub const DIR: [f32; ND] = [0.0, 0.0, -1.0]; 166 | pub const UP : [f32; ND] = [0.0, 1.0, 0.0]; 167 | 168 | //============================================================================== 169 | 170 | pub fn display(event_loop: &EventLoopWindowTarget) -> glium::Display 171 | { 172 | // TODO: idiomatic use paths 173 | 174 | // include_bytes!() statically includes the file relative to this source 175 | // path at compile time 176 | let icon = image::load(Cursor::new(&include_bytes!("../res/icon.png")), 177 | image::ImageFormat::Png).unwrap().to_rgba8(); 178 | let winicon = Some(glutin::window::Icon::from_rgba(icon.to_vec(), 179 | icon.dimensions().0, icon.dimensions().1).unwrap()); 180 | 181 | let wb = glutin::window::WindowBuilder::new() 182 | .with_title(mev!()) 183 | .with_window_icon(winicon) 184 | .with_maximized(true); 185 | //.with_inner_size(glutin::dpi::LogicalSize::new(1960.0, 1390.0)) 186 | //.with_position(glutin::dpi::LogicalPosition::new(0, 0)); 187 | //// ^ this leaves room for an 80 char terminal on my main monitor 188 | 189 | let cb = glutin::ContextBuilder::new().with_depth_buffer(24); 190 | 191 | glium::Display::new(wb, cb, event_loop).unwrap() 192 | } 193 | 194 | //============================================================================== 195 | 196 | pub fn main_loop 197 | ( 198 | event : & glutin::event::Event<'_, T>, 199 | control_flow: &mut glutin::event_loop::ControlFlow, 200 | s : &mut State, 201 | ) 202 | { 203 | let next_frame_time = std::time::Instant::now() + 204 | std::time::Duration::from_nanos(16_666_667); 205 | *control_flow = 206 | glutin::event_loop::ControlFlow::WaitUntil(next_frame_time); 207 | 208 | const PRESSED: glutin::event::ElementState 209 | = glutin::event::ElementState::Pressed; 210 | 211 | match event 212 | { 213 | glutin::event::Event::WindowEvent { event, ..} => match event 214 | { 215 | glutin::event::WindowEvent::CloseRequested => 216 | { 217 | 218 | println!("{}: Exiting main()", ME); 219 | println!(); 220 | 221 | *control_flow = glutin::event_loop::ControlFlow::Exit; 222 | return; 223 | 224 | }, 225 | event::WindowEvent::ModifiersChanged(modifiers_state) => 226 | { 227 | //println!("modifiers_state = {:?}", modifiers_state); 228 | s.ctrl = modifiers_state.ctrl (); 229 | s.shift = modifiers_state.shift(); 230 | }, 231 | glutin::event::WindowEvent::MouseInput {state, button, ..} => 232 | { 233 | //println!("state, button = {:?}, {:?}", state, button); 234 | 235 | match button 236 | { 237 | glutin::event::MouseButton::Left => 238 | { 239 | s.lmb = *state == PRESSED; 240 | }, 241 | glutin::event::MouseButton::Right => 242 | { 243 | s.rmb = *state == PRESSED; 244 | }, 245 | glutin::event::MouseButton::Middle => 246 | { 247 | s.mmb = *state == PRESSED; 248 | }, 249 | _ => () 250 | } 251 | }, 252 | glutin::event::WindowEvent::CursorMoved {position, ..} => 253 | { 254 | //println!("position = {:?}", position); 255 | 256 | let x = position.x as f32; 257 | let y = position.y as f32; 258 | 259 | if s.lmb 260 | { 261 | // Rotate about axis within the xy screen plane 262 | // 263 | // TODO: handle shift-lmb as z rotation 264 | 265 | // Right-hand normal to drag direction 266 | let mut u = [-(y - s.y0), -(x - s.x0), 0.0]; 267 | 268 | let norm = norm(&u); 269 | u[0] /= norm; 270 | u[1] /= norm; 271 | // z is zero, no need to normalize 272 | 273 | let sensitivity = 0.0035; 274 | let theta = sensitivity * norm; 275 | 276 | // Push translation to model center, apply rotation, 277 | // then pop trans 278 | s.world = translate_matrix(&s.world, &neg(&s.cen)); 279 | s.world = rotate_matrix (&s.world, &u, theta); 280 | s.world = translate_matrix(&s.world, &s.cen); 281 | 282 | } 283 | else if s.mmb 284 | { 285 | // xy pan 286 | 287 | //println!("mmb drag"); 288 | 289 | let sensitivity = 1.5 * s.diam //* s.scale_cum 290 | / s.display_diam; 291 | 292 | let dx = sensitivity * (x - s.x0);// / display_h; 293 | let dy = -sensitivity * (y - s.y0);// / display_w; 294 | 295 | let tran = [dx, dy, 0.0]; 296 | 297 | s.world = translate_matrix(&s.world, &tran); 298 | 299 | // Panning moves rotation center too. add() returns 300 | // Vec, so we have to try_into() and unwrap() to array. 301 | s.cen = add(&s.cen, &tran).try_into().unwrap(); 302 | } 303 | else if s.rmb 304 | { 305 | // z pan (eye motion zoom) 306 | // 307 | // This uses the opposite sign convention of ParaView, 308 | // but I think it feels more consistent with the scroll 309 | // wheel action: scrolling up has a similar effect as 310 | // rmb dragging up 311 | 312 | let dz = y - s.y0; 313 | 314 | let sensitivity = 0.003; 315 | s.eye[2] += sensitivity * s.scale_cum * s.diam * dz; 316 | s.view = view_matrix(&s.eye, &DIR, &UP); 317 | } 318 | 319 | s.x0 = x; 320 | s.y0 = y; 321 | }, 322 | glutin::event::WindowEvent::MouseWheel {delta, ..} => 323 | { 324 | // Scroll scaling zoom 325 | // 326 | // ParaView actually has two ways to "zoom": (1) RMB-drag 327 | // moves the eye of the view, while (2) the scroll wheel 328 | // scales the world 329 | 330 | //println!("delta = {:?}", delta); 331 | 332 | let dz = match delta 333 | { 334 | glutin::event::MouseScrollDelta::LineDelta(_a, b) => 335 | { 336 | //println!("a b = {} {}", a, b); 337 | *b 338 | }, 339 | //glutin::event::MouseScrollDelta::PixelDelta(p) => 340 | //{ 341 | // println!("p = {:?}", p); 342 | // //unimplemented!() 343 | //}, 344 | _ => (0.0) 345 | }; 346 | 347 | // This sign convention matches ParaView, although the 348 | // opposite scroll/zoom convention does exist 349 | 350 | let sensitivity = 0.1; 351 | let scale = (sensitivity * dz).exp(); 352 | s.scale_cum *= scale; 353 | 354 | //println!("scale = {}", scale); 355 | 356 | s.world = scale_matrix(&s.world, scale); 357 | s.cen = scale_vec(&s.cen, scale).try_into().unwrap(); 358 | }, 359 | glutin::event::WindowEvent::KeyboardInput {input, ..} => 360 | { 361 | //println!("input = {:?}", input); 362 | 363 | let warp_increment = 0.1; 364 | 365 | if s.ctrl && input.state == PRESSED 366 | { 367 | match input.virtual_keycode.unwrap() 368 | { 369 | event::VirtualKeyCode::W => 370 | { 371 | //println!("Ctrl+W"); 372 | s.rm.warp_factor -= warp_increment; 373 | s.rm.warp(); 374 | } 375 | _ => {} 376 | } 377 | } 378 | else if s.shift && input.state == PRESSED 379 | { 380 | match input.virtual_keycode.unwrap() 381 | { 382 | event::VirtualKeyCode::W => 383 | { 384 | //println!("Shift+W"); 385 | s.rm.warp_factor += warp_increment; 386 | s.rm.warp(); 387 | } 388 | _ => {} 389 | } 390 | } 391 | else if input.state == PRESSED 392 | { 393 | match input.virtual_keycode.unwrap() 394 | { 395 | // TODO: parameterize keycodes 396 | 397 | event::VirtualKeyCode::C => 398 | { 399 | let name; 400 | if s.rm.dindex < s.rm.m.point_data.len() 401 | { 402 | s.rm.comp = (s.rm.comp + 1) 403 | % s.rm.m.point_data[s.rm.dindex].num_comp; 404 | s.rm.bind_point_data(); 405 | name = &s.rm.m.point_data[s.rm.dindex].name; 406 | } 407 | else 408 | { 409 | let cindex = s.rm.dindex - s.rm.m.point_data.len(); 410 | s.rm.comp = (s.rm.comp + 1) 411 | % s.rm.m.cell_data[cindex].num_comp; 412 | s.rm.bind_cell_data(); 413 | name = &s.rm.m.cell_data[cindex].name; 414 | } 415 | 416 | println!("Cycling data comp"); 417 | println!("Data name = {}", name); 418 | println!("Data comp = {}\n", s.rm.comp); 419 | } 420 | event::VirtualKeyCode::D => 421 | { 422 | let name; 423 | let data_len = s.rm.m.point_data.len() 424 | + s.rm.m. cell_data.len(); 425 | 426 | s.rm.dindex = (s.rm.dindex + 1) % data_len; 427 | s.rm.comp = 0; 428 | 429 | // Cycle through point data first, then go to 430 | // cells if we're past the end of the points. 431 | if s.rm.dindex < s.rm.m.point_data.len() 432 | { 433 | s.rm.bind_point_data(); 434 | name = &s.rm.m.point_data[s.rm.dindex].name; 435 | } 436 | else 437 | { 438 | // TODO: add a generic 439 | // s.rm.get_name() fn to handle this 440 | // index logic for both point and cell data 441 | 442 | let cindex = s.rm.dindex - s.rm.m.point_data.len(); 443 | s.rm.bind_cell_data(); 444 | name = &s.rm.m.cell_data[cindex].name; 445 | } 446 | 447 | println!("Cycling data array"); 448 | println!("Data name = {}", name); 449 | } 450 | event::VirtualKeyCode::E => 451 | { 452 | s.rm.edge_visibility = !s.rm.edge_visibility; 453 | println!("Toggling edge visibility {}", 454 | s.rm.edge_visibility); 455 | } 456 | event::VirtualKeyCode::M => 457 | { 458 | println!("Cycling colormap"); 459 | 460 | // Modulo wrapping happens inside 461 | // get_colormap(). Maybe I should make 462 | // bind_*_data() work like that too. 463 | s.map_index += 1; 464 | //s.colormap = get_colormap(&mut s.map_index, s.rm.facade); 465 | s.colormap = get_colormap(&mut s.map_index, &s.display); 466 | } 467 | event::VirtualKeyCode::W => 468 | { 469 | println!("Cycling warp"); 470 | s.rm.warp_index += 1; 471 | s.rm.warp(); 472 | } 473 | 474 | _ => {} 475 | } 476 | } 477 | }, 478 | _ => return, 479 | }, 480 | 481 | glutin::event::Event::NewEvents(cause) => match cause 482 | { 483 | glutin::event::StartCause::ResumeTimeReached {..} => (), 484 | glutin::event::StartCause::Init => (), 485 | _ => return, 486 | }, 487 | _ => return, 488 | } 489 | 490 | // Apparently the rendering below must be in the same fn as the event 491 | // handling above, otherwise perf takes a massive hit 492 | 493 | let mut target = s.display.draw(); 494 | 495 | s.display_diam = tnorm(target.get_dimensions()); 496 | 497 | target.clear_color_and_depth((0.0, 0.0, 0.0, 1.0), 1.0); 498 | 499 | let fov: f32 = PI / 6.0; 500 | let zfar = 1024.0; 501 | let znear = 0.1; 502 | 503 | let perspective = 504 | perspective_matrix(fov, zfar, znear, target.get_dimensions()); 505 | 506 | // Light direction 507 | let light = [0.2, -0.6, -1.0f32];//[-1.4, -0.0, -0.7f32]; 508 | //let light = [1.4, 0.4, -0.7f32]; 509 | 510 | // Linear sampling works better than the default, especially around 511 | // texture 0 512 | let tex = glium::uniforms::Sampler::new(&s.colormap) 513 | .magnify_filter(glium::uniforms::MagnifySamplerFilter::Linear) 514 | .minify_filter(glium::uniforms::MinifySamplerFilter::Linear); 515 | 516 | let bg_tex = glium::uniforms::Sampler::new(&s.bg.colormap) 517 | .magnify_filter(glium::uniforms::MagnifySamplerFilter::Linear) 518 | .minify_filter(glium::uniforms::MinifySamplerFilter::Linear); 519 | 520 | let uniforms = uniform! 521 | { 522 | perspective: perspective, 523 | view : s.view , 524 | world: s.world, 525 | model_mat: s.rm.mat, 526 | u_light: light, 527 | tex: tex, 528 | bg_tex: bg_tex, 529 | }; 530 | 531 | let params = glium::DrawParameters 532 | { 533 | depth: glium::Depth 534 | { 535 | test: glium::draw_parameters::DepthTest::IfLessOrEqual, 536 | write: true, 537 | 538 | // High zoom levels are weird, but they're weirder without this. 539 | // Maybe increase depth buffer bits too? 540 | clamp: glium::draw_parameters::DepthClamp::Clamp, 541 | 542 | .. Default::default() 543 | }, 544 | 545 | // Hack around z-fighting for edge display. Units are pixels 546 | polygon_offset: glium::draw_parameters::PolygonOffset 547 | { 548 | factor: 1.01, 549 | //units: 3.0, 550 | //line: true, 551 | fill: true, 552 | .. Default::default() 553 | }, 554 | 555 | // This is the default. It could be increased, but the 556 | // polygon_offset works better than thickening. Could expose to 557 | // user as an option 558 | line_width: Some(1.0), 559 | 560 | //backface_culling: glium::draw_parameters::BackfaceCullingMode 561 | // ::CullClockwise, 562 | 563 | .. Default::default() 564 | }; 565 | 566 | target.draw(&s.bg.vertices, &s.bg.indices, &s.bg.program, 567 | &uniforms, ¶ms).unwrap(); 568 | 569 | // Clearing the depth again here forces the background to the back 570 | target.clear_depth(1.0); 571 | 572 | // TODO: move this to a RenderModel method? Either pass program, uniforms, 573 | // and params as args or encapsulate them in RenderModel struct. Actually 574 | // it seems nearly impossible to pass uniforms as a single arg. I tried and 575 | // failed to do so for the background. Maybe encapsulate them in another 576 | // struct (state?) and pass that instead? 577 | target.draw(( 578 | &s.rm.vertices, 579 | &s.rm.normals, 580 | &s.rm.scalar), 581 | &s.rm.indices, 582 | &s.face_program, &uniforms, ¶ms).unwrap(); 583 | 584 | if s.rm.edge_visibility 585 | { 586 | target.draw( 587 | &s.rm.edge_verts, 588 | &s.rm.edge_indices, 589 | &s.edge_program, &uniforms, ¶ms).unwrap(); 590 | } 591 | 592 | // TODO: draw axes, colormap legend 593 | 594 | // Swap buffers 595 | target.finish().unwrap(); 596 | 597 | // TODO: take screenshot and compare for testing (just don't do it 598 | // everytime in the main loop. maybe do that in a separate test/example) 599 | } 600 | 601 | //============================================================================== 602 | 603 | -------------------------------------------------------------------------------- /src/background.rs: -------------------------------------------------------------------------------- 1 | 2 | //============================================================================== 3 | 4 | use crate::consts::*; 5 | 6 | #[derive(Copy, Clone, Debug)] 7 | pub struct Vert2 8 | { 9 | // 2D node for background 10 | position2: [f32; N2], 11 | tex_coord: f32, 12 | } 13 | implement_vertex!(Vert2, position2, tex_coord); 14 | 15 | pub struct Background 16 | { 17 | pub colormap: glium::texture::SrgbTexture1d, 18 | pub program : glium::Program, 19 | pub vertices: glium::VertexBuffer, 20 | pub indices : glium::IndexBuffer, 21 | } 22 | 23 | //============================================================================== 24 | 25 | fn get_colormap(facade: &dyn glium::backend::Facade) -> glium::texture::SrgbTexture1d 26 | { 27 | // Define the colormap for the gradient background. It has to be saved as 28 | // a texture to be able to use gamma correction (sRGB). Colors are based on 29 | // jekyll cayman theme. 30 | // 31 | // c.f. colormaps.rs 32 | // 33 | let cmap = vec! 34 | [ 35 | 21u8, 87u8, 154u8, 255u8, 36 | 21u8, 154u8, 87u8, 255u8, 37 | ]; 38 | 39 | let image = glium::texture::RawImage1d::from_raw_rgba(cmap); 40 | glium::texture::SrgbTexture1d::new(facade, image).unwrap() 41 | } 42 | 43 | //============================================================================== 44 | 45 | impl Background 46 | { 47 | pub fn new(facade: &dyn glium::backend::Facade) -> Background 48 | { 49 | let colormap = get_colormap(facade); 50 | 51 | let vertex_shader_src = r#" 52 | #version 150 53 | 54 | in vec2 position2; 55 | in float tex_coord; 56 | out float v_tex_coord; 57 | 58 | void main() { 59 | v_tex_coord = tex_coord; 60 | gl_Position = vec4(position2, 0, 1.0); 61 | } 62 | "#; 63 | 64 | let fragment_shader_src = r#" 65 | #version 150 66 | 67 | in float v_tex_coord; 68 | out vec4 color; 69 | 70 | uniform sampler1D bg_tex; 71 | 72 | void main() { 73 | color = texture(bg_tex, v_tex_coord); 74 | } 75 | "#; 76 | 77 | // c.f. shaders.rs 78 | let program = glium::Program::from_source(facade, vertex_shader_src, 79 | fragment_shader_src, None).unwrap(); 80 | 81 | // background vertices 82 | let verts = vec! 83 | [ 84 | Vert2 { position2: [-1.0, -1.0], tex_coord: 0.5, }, 85 | Vert2 { position2: [ 1.0, -1.0], tex_coord: 1.0, }, 86 | Vert2 { position2: [ 1.0, 1.0], tex_coord: 0.5, }, 87 | Vert2 { position2: [-1.0, 1.0], tex_coord: 0.0, }, 88 | ]; 89 | 90 | Background 91 | { 92 | colormap: colormap, 93 | program : program, 94 | vertices: glium::VertexBuffer::new(facade, &verts).unwrap(), 95 | indices : glium::IndexBuffer::new(facade, 96 | glium::index::PrimitiveType::TrianglesList, 97 | &[ 98 | 0, 1, 2, 99 | 2, 3, 0 as u32 100 | ]).unwrap(), 101 | } 102 | } 103 | } 104 | 105 | //============================================================================== 106 | 107 | -------------------------------------------------------------------------------- /src/colormaps.rs: -------------------------------------------------------------------------------- 1 | 2 | //============================================================================== 3 | 4 | use serde_json; 5 | const CMAPS: &str = include_str!("../res/colormaps.json"); 6 | 7 | pub fn get_colormap(index: &mut usize, display: &glium::Display) -> glium::texture::SrgbTexture1d 8 | { 9 | // Define the colormap by loading an indexed map from a json array 10 | // 11 | // TODO: currate resource file. Some maps need extra interp points to look 12 | // good, some are in color spaces that I can't handle properly, and some 13 | // just don't look that interesting 14 | 15 | //println!("CMAPS = {}", CMAPS); 16 | 17 | let cmaps: serde_json::Value = serde_json::from_str(CMAPS).unwrap(); 18 | 19 | let cmaps_len = cmaps.as_array().unwrap().len(); 20 | if *index >= cmaps_len 21 | { 22 | *index = 0; 23 | } 24 | 25 | //println!("CMAPS[{}] = {}", *index, cmaps[*index]); 26 | 27 | let xrgb = &cmaps[*index]["RGBPoints"]; 28 | let xrgb_len = xrgb.as_array().unwrap().len(); 29 | 30 | //println!("xrgb = {}", xrgb); 31 | //println!("xrgb.len() = {}", xrgb_len); 32 | 33 | let mut cmap = Vec::::with_capacity(xrgb_len); 34 | 35 | // Format is slightly different. Ignore x value from xrgb, add alpha value, 36 | // and scale everything from [0, 1] to [0, 255] 37 | 38 | let cmax = 255.0; 39 | for i in (0 .. xrgb_len).step_by(4) 40 | { 41 | cmap.push((xrgb[i+1].as_f64().unwrap() * cmax) as u8); // R 42 | cmap.push((xrgb[i+2].as_f64().unwrap() * cmax) as u8); // G 43 | cmap.push((xrgb[i+3].as_f64().unwrap() * cmax) as u8); // B 44 | 45 | // Alpha 46 | cmap.push(cmax as u8); 47 | } 48 | 49 | let image = glium::texture::RawImage1d::from_raw_rgba(cmap); 50 | glium::texture::SrgbTexture1d::new(display, image).unwrap() 51 | } 52 | 53 | //============================================================================== 54 | 55 | -------------------------------------------------------------------------------- /src/consts.rs: -------------------------------------------------------------------------------- 1 | 2 | //============================================================================== 3 | 4 | // Global constants 5 | 6 | pub const ME: &str = "Skillet"; 7 | pub const MAJOR: &str = env!("CARGO_PKG_VERSION_MAJOR"); 8 | pub const MINOR: &str = env!("CARGO_PKG_VERSION_MINOR"); 9 | pub const PATCH: &str = env!("CARGO_PKG_VERSION_PATCH"); 10 | 11 | // I can't figure out how to cat const strs to another const str, but I can make 12 | // a macro 13 | #[macro_export] 14 | macro_rules! mev 15 | { 16 | () => 17 | { 18 | format!("{} {}.{}.{}", ME, MAJOR, MINOR, PATCH) 19 | }; 20 | } 21 | 22 | pub use std::f32::consts::PI; 23 | 24 | // Number of dimensions 25 | pub const ND: usize = 3; 26 | pub const N2: usize = 2; 27 | 28 | // Number of vertices per triangle 29 | pub const NT: usize = 3; 30 | 31 | // Number of vertices per edge (line) 32 | pub const NE: usize = 2; 33 | 34 | // Augmented matrix size 35 | pub const NM: usize = ND + 1; 36 | 37 | //============================================================================== 38 | 39 | -------------------------------------------------------------------------------- /src/edge.glsl: -------------------------------------------------------------------------------- 1 | 2 | #version 150 3 | out vec4 color; 4 | 5 | // This could be a uniform 6 | const vec4 edge_color = vec4(0.0, 0.0, 0.0, 1.0); 7 | 8 | void main() 9 | { 10 | color = edge_color; 11 | } 12 | 13 | -------------------------------------------------------------------------------- /src/frag.glsl: -------------------------------------------------------------------------------- 1 | 2 | #version 150 3 | 4 | in vec3 v_normal; 5 | in vec3 v_position; 6 | in float v_tex_coord; 7 | 8 | out vec4 color; 9 | 10 | uniform vec3 u_light; 11 | uniform sampler1D tex; 12 | 13 | // Some of these parameters, like specular color or shininess, could be 14 | // moved into uniforms, or they're probably fine as defaults 15 | 16 | const vec4 specular_color = vec4(0.1, 0.1, 0.1, 1.0); 17 | 18 | vec4 diffuse_color = texture(tex, v_tex_coord); 19 | vec4 ambient_color = diffuse_color * 0.1; 20 | 21 | void main() 22 | { 23 | float diffuse = 24 | max(dot(normalize(v_normal), normalize(u_light)), 0.0); 25 | 26 | vec3 camera_dir = normalize(-v_position); 27 | vec3 half_dir = normalize(normalize(u_light) + camera_dir); 28 | float specular = 29 | pow(max(dot(half_dir, normalize(v_normal)), 0.0), 40.0); 30 | 31 | color = ambient_color + diffuse * diffuse_color 32 | + specular * specular_color; 33 | } 34 | 35 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | 2 | #[macro_use] 3 | 4 | pub mod colormaps; 5 | pub mod consts; 6 | pub mod math; 7 | pub mod model; 8 | pub mod shaders; 9 | pub mod utils; 10 | 11 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | 2 | //============================================================================== 3 | 4 | // Standard 5 | use std::env; 6 | use std::path::PathBuf; 7 | use std::rc::Rc; 8 | 9 | //**************** 10 | 11 | // This crate, included in lib 12 | use skillet::*; 13 | use crate::consts::*; 14 | use crate::model; 15 | use crate::model::RenderModel; 16 | 17 | // Not included in lib 18 | pub mod app; 19 | pub mod background; 20 | 21 | use app::State; 22 | 23 | //**************** 24 | // 3P(s) 25 | //**************** 26 | 27 | #[macro_use] 28 | extern crate glium; 29 | 30 | use glium::glutin::event_loop::EventLoop; 31 | 32 | //============================================================================== 33 | 34 | fn main() 35 | { 36 | 37 | println!(); 38 | println!("{}: Starting main()", ME); 39 | println!("{}: {}", ME, mev!()); 40 | println!(); 41 | 42 | let exe = utils::get_exe_base("skillet.exe"); 43 | 44 | // Switch to clap if args become more complicated than a single filename 45 | let args: Vec = env::args().collect(); 46 | if args.len() < 2 47 | { 48 | println!("Error: bad command-line arguments"); 49 | println!("Usage:"); 50 | println!(); 51 | println!("\t{} FILE.VTK", exe); 52 | println!(); 53 | return; 54 | } 55 | 56 | let file_path = PathBuf::from(args[1].clone()); 57 | 58 | // Ownership of the Model is transferred to the RenderModel later, so it's 59 | // in a Box 60 | let model = Box::new(model::import(file_path)); 61 | 62 | let event_loop = EventLoop::new(); 63 | 64 | // Ownership of the Display is shared between the RenderModel and the State, 65 | // so it's in an Rc. It can't be singly-owned as far as I can tell, because 66 | // RenderModel uses it cast as a facade, while State uses it directly as 67 | // Display :( 68 | let display = Rc::new(app::display(&event_loop)); 69 | 70 | let render_model = Box::new(RenderModel::new(model, display.clone())); 71 | 72 | let mut state = State::new(render_model, display); 73 | 74 | println!("{}: Starting main loop", ME); 75 | println!(); 76 | 77 | event_loop.run(move |event, _, control_flow| 78 | { 79 | app::main_loop(&event, control_flow, &mut state); 80 | }); 81 | } 82 | 83 | //============================================================================== 84 | 85 | -------------------------------------------------------------------------------- /src/math.rs: -------------------------------------------------------------------------------- 1 | 2 | //============================================================================== 3 | 4 | use crate::consts::*; 5 | 6 | //============================================================================== 7 | 8 | // TODO: consider using nalgebra crate for vector/matrix wrapper types with 9 | // operator overloading 10 | 11 | // We can't overload "+" operator because rust makes it impossible by design 12 | // without a wrapper type :( 13 | pub fn add(a: &[f32], b: &[f32]) -> Vec 14 | { 15 | if a.len() != b.len() 16 | { 17 | panic!("Incorrect length for add() arguments"); 18 | } 19 | 20 | //a.iter().zip(b.iter()).map(|(x, y)| x - y).collect() 21 | 22 | let mut c = Vec::with_capacity(a.len()); 23 | for i in 0 .. a.len() 24 | { 25 | c.push(a[i] + b[i]); 26 | } 27 | c 28 | } 29 | 30 | //============================================================================== 31 | 32 | pub fn sub(a: &[f32], b: &[f32]) -> Vec 33 | { 34 | if a.len() != b.len() 35 | { 36 | panic!("Incorrect length for sub() arguments"); 37 | } 38 | 39 | //a.iter().zip(b.iter()).map(|(x, y)| x - y).collect() 40 | 41 | let mut c = Vec::with_capacity(a.len()); 42 | for i in 0 .. a.len() 43 | { 44 | c.push(a[i] - b[i]); 45 | } 46 | c 47 | } 48 | 49 | //============================================================================== 50 | 51 | pub fn neg(a: &[f32]) -> Vec 52 | { 53 | a.iter().map(|x| -x).collect() 54 | } 55 | 56 | //============================================================================== 57 | 58 | pub fn dot(a: &[f32], b: &[f32]) -> f32 59 | { 60 | if a.len() != b.len() 61 | { 62 | panic!("Incorrect length for dot() arguments"); 63 | } 64 | 65 | //// Unreadable IMO 66 | //a.iter().zip(b.iter()).map(|(x, y)| x * y).sum() 67 | 68 | let mut d = 0.0; 69 | for i in 0 .. a.len() 70 | { 71 | d += a[i] * b[i]; 72 | } 73 | d 74 | } 75 | 76 | //============================================================================== 77 | 78 | pub fn norm(a: &[f32]) -> f32 79 | { 80 | dot(&a, &a).sqrt() 81 | } 82 | 83 | //============================================================================== 84 | 85 | pub fn tnorm((w, h): (u32, u32)) -> f32 86 | { 87 | // Tuple norm 88 | ((w*w) as f32 + (h*h) as f32).sqrt() 89 | } 90 | 91 | //============================================================================== 92 | 93 | pub fn normalize(a: &[f32]) -> Vec 94 | { 95 | let norm = norm(a); 96 | a.iter().map(|x| x / norm).collect() 97 | } 98 | 99 | //============================================================================== 100 | 101 | pub fn scale_vec(a: &[f32], s: f32) -> Vec 102 | { 103 | a.iter().map(|x| s * x).collect() 104 | } 105 | 106 | //============================================================================== 107 | 108 | pub fn cross(a: &[f32], b: &[f32]) -> [f32; ND] 109 | { 110 | if a.len() != ND || b.len() != ND 111 | { 112 | // 3D only. This could return a Return value instead. I can't put this 113 | // check into the function signature because then rust will only accept 114 | // arrays as args, not slices or Vecs. 115 | panic!("Incorrect length for cross() argument. \ 116 | Expected length {}", ND); 117 | } 118 | 119 | [ 120 | a[1] * b[2] - a[2] * b[1], 121 | a[2] * b[0] - a[0] * b[2], 122 | a[0] * b[1] - a[1] * b[0], 123 | ] 124 | } 125 | 126 | //============================================================================== 127 | 128 | pub fn identity_matrix() -> [[f32; NM]; NM] 129 | {[ 130 | [1.0, 0.0, 0.0, 0.0], 131 | [0.0, 1.0, 0.0, 0.0], 132 | [0.0, 0.0, 1.0, 0.0], 133 | [0.0, 0.0, 0.0, 1.0], 134 | ]} 135 | 136 | //============================================================================== 137 | 138 | pub fn mul_mat4(a: &[[f32; NM]; NM], b: &[[f32; NM]; NM]) -> [[f32; NM]; NM] 139 | { 140 | let mut c = [[0.0; NM]; NM]; 141 | for i in 0 .. NM 142 | { 143 | for j in 0 .. NM 144 | { 145 | for k in 0 .. NM 146 | { 147 | c[i][j] += a[i][k] * b[k][j]; 148 | } 149 | } 150 | } 151 | c 152 | } 153 | 154 | //============================================================================== 155 | 156 | pub fn scale_matrix(m: &[[f32; NM]; NM], s: f32) -> [[f32; NM]; NM] 157 | { 158 | // Scale in place and apply after m 159 | 160 | // Don't scale the 4th component 161 | let sm = 162 | [ 163 | [ s, 0.0, 0.0, 0.0], 164 | [ 0.0, s, 0.0, 0.0], 165 | [ 0.0, 0.0, s, 0.0], 166 | [ 0.0, 0.0, 0.0, 1.0], 167 | ]; 168 | mul_mat4(m, &sm) 169 | } 170 | 171 | //============================================================================== 172 | 173 | pub fn translate_matrix(m: &[[f32; NM]; NM], u: &[f32]) -> [[f32; NM]; NM] 174 | { 175 | // Translate in place and apply after m 176 | 177 | let t = 178 | [ 179 | [ 1.0, 0.0, 0.0, 0.0], 180 | [ 0.0, 1.0, 0.0, 0.0], 181 | [ 0.0, 0.0, 1.0, 0.0], 182 | [u[0], u[1], u[2], 1.0], 183 | ]; 184 | 185 | mul_mat4(m, &t) 186 | } 187 | 188 | //============================================================================== 189 | 190 | pub fn rotate_matrix(m: &[[f32; NM]; NM], u: &[f32; ND], theta: f32) 191 | -> [[f32; NM]; NM] 192 | { 193 | // General axis-angle rotation about an axis vector [x,y,z] by angle theta. 194 | // Vector must be normalized! Apply rotation r to input matrix m and return 195 | // m * r. 196 | 197 | // Skip identity/singular case. Caller likely set vector to garbage 198 | if theta == 0.0f32 199 | { 200 | return *m; 201 | } 202 | 203 | // Ref: 204 | // 205 | // https://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle 206 | // 207 | // c.f. 208 | // 209 | // https://github.com/JeffIrwin/temple-viewer/blob/c25f28cf3457edc136d213fd01df47d826bc279b/Math.HC#L39 210 | 211 | let c = theta.cos(); 212 | let s = theta.sin(); 213 | let t = 1.0 - c; 214 | 215 | let x = u[0]; 216 | let y = u[1]; 217 | let z = u[2]; 218 | 219 | let r = 220 | [ 221 | [c + x*x*t , x*y*t - z*s, z*x*t + y*s, 0.0], 222 | [x*y*t + z*s, c + y*y*t, y*z*t - x*s, 0.0], 223 | [z*x*t - y*s, y*z*t + x*s, c + z*z*t, 0.0], 224 | [ 0.0, 0.0, 0.0, 1.0], 225 | ]; 226 | 227 | //println!("theta = {:?}", theta); 228 | //println!("r = {:?}", r); 229 | 230 | mul_mat4(m, &r) 231 | } 232 | 233 | //============================================================================== 234 | 235 | pub fn view_matrix(position: &[f32; ND], direction: &[f32; ND], up: &[f32; ND]) 236 | -> [[f32; NM]; NM] 237 | { 238 | // Ref: 239 | // 240 | // https://github.com/JeffIrwin/glfw/blob/9416a43404934cc54136e988a233bee64d4d48fb/deps/linmath.h#L404 241 | // 242 | // Note this version has a "direction" arg instead of "center", but it's 243 | // equivalent 244 | 245 | let f = normalize(direction); 246 | let s = normalize(&cross(&f, up)); 247 | let u = cross(&s, &f); 248 | 249 | let p = [-dot(position, &s), 250 | -dot(position, &u), 251 | -dot(position, &f)]; 252 | 253 | [ 254 | [s[0], u[0], -f[0], 0.0], 255 | [s[1], u[1], -f[1], 0.0], 256 | [s[2], u[2], -f[2], 0.0], 257 | [p[0], p[1], -p[2], 1.0], 258 | ] 259 | } 260 | 261 | //============================================================================== 262 | 263 | pub fn perspective_matrix(fov: f32, zfar: f32, znear: f32, 264 | (width, height): (u32, u32)) 265 | -> [[f32; NM]; NM] 266 | { 267 | // Right-handed (as god intended) 268 | // 269 | // Ref: http://perry.cz/articles/ProjectionMatrix.xhtml 270 | 271 | let aspect_ratio = height as f32 / width as f32; 272 | let f = 1.0 / (fov / 2.0).tan(); 273 | 274 | [ 275 | [f * aspect_ratio, 0.0, 0.0 , 0.0], 276 | [ 0.0 , f, 0.0 , 0.0], 277 | [ 0.0 , 0.0, - (zfar+znear)/(zfar-znear), -1.0], 278 | [ 0.0 , 0.0, -(2.0*zfar*znear)/(zfar-znear), 0.0], 279 | ] 280 | } 281 | 282 | //============================================================================== 283 | 284 | -------------------------------------------------------------------------------- /src/model.rs: -------------------------------------------------------------------------------- 1 | 2 | //**************** 3 | 4 | use std::ops::Deref; 5 | use std::rc::Rc; 6 | 7 | //**************** 8 | 9 | use crate::consts::*; 10 | use crate::math::*; 11 | use crate::utils; 12 | 13 | //**************** 14 | 15 | // 3P 16 | use vtkio::{model::{Attribute, DataArray, DataSet, ElementType, Vtk}}; 17 | 18 | //============================================================================== 19 | 20 | #[derive(PartialEq, Clone, Copy)] 21 | pub enum Type 22 | { 23 | // There are a few others, but I'm not planning to implement them 24 | 25 | Tri, 26 | Quad, 27 | Tet, 28 | Hex, 29 | Wedge, 30 | Pyramid, 31 | 32 | // TODO: test quad, tet, wedge, and pyramid 33 | 34 | Invalid, // supported in vtkio but not here 35 | } 36 | 37 | pub fn cell_tris(t: Type) -> Vec 38 | { 39 | // These could be member fn's, but unit testing might be easier if they're 40 | // not. 41 | // 42 | // Return an array of indices of triangle vertices that make up a more 43 | // complex cell type 44 | // 45 | // Ref: http://www.princeton.edu/~efeibush/viscourse/vtk.pdf 46 | // 47 | // Right-hand ordering of 3 vertices points to the outward normal direction 48 | // 49 | match t 50 | { 51 | Type::Tri => vec! 52 | [ 53 | 0, 1, 2, 54 | ], 55 | Type::Quad => vec! 56 | [ 57 | 0, 1, 2, 58 | 2, 3, 0, 59 | ], 60 | Type::Tet => vec! 61 | [ 62 | 0, 2, 1, 63 | 0, 1, 3, 64 | 0, 3, 2, 65 | 1, 2, 3, 66 | ], 67 | Type::Hex => vec! 68 | [ 69 | 0, 3, 2, 2, 1, 0, 70 | 4, 5, 6, 6, 7, 4, 71 | 0, 1, 5, 5, 4, 0, 72 | 1, 2, 6, 6, 5, 1, 73 | 2, 3, 7, 7, 6, 2, 74 | 0, 4, 7, 7, 3, 0, 75 | ], 76 | Type::Wedge => vec! 77 | [ 78 | 0, 1, 2, 79 | 3, 5, 4, 80 | 0, 2, 3, 2, 5, 3, 81 | 1, 4, 5, 5, 2, 1, 82 | 0, 3, 4, 4, 1, 0, 83 | ], 84 | Type::Pyramid => vec! 85 | [ 86 | 0, 1, 4, 87 | 1, 2, 4, 88 | 2, 3, 4, 89 | 3, 0, 4, 90 | 0, 3, 2, 2, 1, 0, 91 | ], 92 | 93 | Type::Invalid => vec![], 94 | } 95 | } 96 | 97 | //============================================================================== 98 | 99 | pub fn cell_num_verts(t: Type) -> usize 100 | { 101 | // max(cell_tris) + 1 102 | // 103 | // TODO: ^ verify with unit tests 104 | match t 105 | { 106 | Type::Tri => 3, 107 | Type::Quad => 4, 108 | Type::Tet => 4, 109 | Type::Hex => 8, 110 | Type::Wedge => 6, 111 | Type::Pyramid => 5, 112 | 113 | Type::Invalid => 0, 114 | } 115 | } 116 | 117 | //============================================================================== 118 | 119 | pub fn cell_edges(t: Type) -> Vec 120 | { 121 | // Return an array of edge vertices that make up a more complex cell type 122 | match t 123 | { 124 | Type::Tri => vec! 125 | [ 126 | 0, 1, 127 | 1, 2, 128 | 2, 0, 129 | ], 130 | Type::Quad => vec! 131 | [ 132 | 0, 1, 133 | 1, 2, 134 | 2, 3, 135 | 3, 0, 136 | ], 137 | Type::Tet => vec! 138 | [ 139 | 0, 1, 140 | 0, 2, 141 | 0, 3, 142 | 1, 2, 143 | 1, 3, 144 | 2, 3, 145 | ], 146 | Type::Hex => vec! 147 | [ 148 | 0, 1, 149 | 1, 2, 150 | 2, 3, 151 | 3, 0, 152 | 4, 5, 153 | 5, 6, 154 | 6, 7, 155 | 7, 4, 156 | 0, 4, 157 | 1, 5, 158 | 2, 6, 159 | 3, 7, 160 | ], 161 | Type::Wedge => vec! 162 | [ 163 | 0, 1, 1, 2, 2, 0, 164 | 3, 4, 4, 5, 5, 3, 165 | 0, 3, 166 | 1, 4, 167 | 2, 5, 168 | ], 169 | Type::Pyramid => vec! 170 | [ 171 | 0, 1, 172 | 1, 2, 173 | 2, 3, 174 | 3, 0, 175 | 0, 4, 176 | 1, 4, 177 | 2, 4, 178 | 3, 4, 179 | ], 180 | 181 | Type::Invalid => vec![], 182 | } 183 | } 184 | 185 | //============================================================================== 186 | 187 | pub struct Model 188 | { 189 | // The Model struct contains the geometry and its associated point data 190 | // 191 | // For now, this is just a wrapper for the vtkio vtk struct, although it 192 | // could be generalized for other file formats 193 | 194 | // Point coordinates 195 | pub points: Vec, 196 | 197 | // Cell connectivity 198 | pub types : Vec, 199 | pub cells : Vec, 200 | pub offsets: Vec, 201 | 202 | // Data arrays (e.g. scalars, vectors, tensors) 203 | pub point_data: Vec, 204 | pub cell_data: Vec, 205 | } 206 | 207 | pub struct Data 208 | { 209 | // A single point or cell data array 210 | pub data: Vec, 211 | pub name: String, 212 | pub num_comp: usize, 213 | } 214 | 215 | impl Model 216 | { 217 | pub fn new() -> Model 218 | { 219 | Model 220 | { 221 | points: Vec::new(), 222 | //piece: UnstructuredGridPiece::new(), 223 | 224 | types : Vec::new(), 225 | cells : Vec::new(), 226 | offsets: Vec::new(), 227 | 228 | point_data: Vec::new(), 229 | cell_data: Vec::new(), 230 | } 231 | } 232 | 233 | //**************** 234 | 235 | pub fn tris(&self) -> Vec 236 | { 237 | // TODO: can this be done without looking up tris again, and without 238 | // saving tris to memory as a struct member? Can RenderModel indices be 239 | // used instead? Tri lookup is only performed on loading and on 240 | // bind_point_data() for changing data arrays, so it doesn't seem worth 241 | // saving in memory. 242 | 243 | // Capacity could be set ahead of time for tris with an extra pass over 244 | // cell types to count triangles 245 | let mut tris = Vec::new(); 246 | for i in 0 .. self.types.len() as usize 247 | { 248 | let t = cell_tris(self.types[i]); 249 | let nv = cell_num_verts(self.types[i]); 250 | let nt = t.len() / NT; 251 | 252 | //println!("nt = {}", nt); 253 | 254 | for it in 0 .. nt as usize 255 | { 256 | let i0 = self.offsets[i] as usize - nv + t[NT * it + 0]; 257 | let i1 = self.offsets[i] as usize - nv + t[NT * it + 1]; 258 | let i2 = self.offsets[i] as usize - nv + t[NT * it + 2]; 259 | 260 | tris.push(self.cells[i0]); 261 | tris.push(self.cells[i1]); 262 | tris.push(self.cells[i2]); 263 | } 264 | } 265 | tris 266 | } 267 | 268 | //**************** 269 | 270 | pub fn edges(&self) -> Vec 271 | { 272 | let mut edges = Vec::new(); 273 | for i in 0 .. self.types.len() as usize 274 | { 275 | let e = cell_edges(self.types[i]); 276 | let nv = cell_num_verts(self.types[i]); 277 | let ne = e.len() / NE; 278 | 279 | //println!("ne = {}", ne); 280 | 281 | for ie in 0 .. ne as usize 282 | { 283 | let i0 = self.offsets[i] as usize - nv + e[NE * ie + 0]; 284 | let i1 = self.offsets[i] as usize - nv + e[NE * ie + 1]; 285 | 286 | edges.push(self.cells[i0]); 287 | edges.push(self.cells[i1]); 288 | } 289 | } 290 | edges 291 | } 292 | } 293 | 294 | //**************** 295 | 296 | // Split position and texture coordinates into separate arrays. That way we can 297 | // change texture coordinates (e.g. rescale a colorbar range or load a different 298 | // data array) without sending the position arrays to the GPU again 299 | 300 | #[derive(Copy, Clone, Debug)] 301 | pub struct Vert 302 | { 303 | // 3D vert 304 | position: [f32; ND] 305 | } 306 | glium::implement_vertex!(Vert, position); 307 | 308 | // Even vectors and tensors are be rendered as "scalars", since you can 309 | // only colormap one component (or magnitude) at a time, which is a scalar 310 | #[derive(Copy, Clone)] 311 | pub struct Scalar 312 | { 313 | tex_coord: f32, 314 | } 315 | glium::implement_vertex!(Scalar, tex_coord); 316 | 317 | #[derive(Copy, Clone, Debug)] 318 | pub struct Normal 319 | { 320 | normal: [f32; ND] 321 | } 322 | glium::implement_vertex!(Normal, normal); 323 | 324 | //============================================================================== 325 | 326 | pub struct RenderModel 327 | { 328 | // The RenderModel struct is an interface layer between the Model and 329 | // glium's GL array/buffer object bindings 330 | // 331 | // TODO: should this struct contain a ref to the facade? That could 332 | // eliminate some fn args 333 | 334 | pub vertices: glium::VertexBuffer, 335 | pub normals : glium::VertexBuffer, 336 | pub scalar : glium::VertexBuffer, 337 | pub indices : glium::index::NoIndices, 338 | 339 | pub edge_visibility: bool, 340 | pub edge_verts : glium::VertexBuffer, 341 | pub edge_indices: glium::index::NoIndices, 342 | 343 | pub warp_factor: f32, 344 | pub warp_index: usize, 345 | 346 | // Data array and component indices for color contour 347 | pub comp : usize, 348 | pub dindex: usize, 349 | 350 | // Model matrix 351 | pub mat: [[f32; NM]; NM], 352 | 353 | // References to parent Model and facade/display 354 | pub m : Box, 355 | pub facade: Rc, 356 | } 357 | 358 | fn verts(m: &Model, enable_warp: bool, index: usize, factor: f32) 359 | -> (Vec, Vec, Vec) 360 | { 361 | let tris = m.tris(); 362 | 363 | // You would think that normals could be 1/3 this size, but they need to 364 | // be duplicated for each vertex of a triangle for sharp edge shading 365 | let mut verts = Vec::with_capacity(tris.len()); 366 | let mut normals = Vec::with_capacity(tris.len()); 367 | 368 | for i in 0 .. tris.len() / NT 369 | { 370 | // Local array containing the coordinates of the vertices of 371 | // a single triangle 372 | let mut p: [f32; NT * ND] = [0.0; NT * ND]; 373 | 374 | for j in 0 .. NT 375 | { 376 | p[NT*j + 0] = m.points[ND*tris[NT*i + j] as usize + 0]; 377 | p[NT*j + 1] = m.points[ND*tris[NT*i + j] as usize + 1]; 378 | p[NT*j + 2] = m.points[ND*tris[NT*i + j] as usize + 2]; 379 | 380 | let (dx, dy, dz) = if enable_warp 381 | {( 382 | m.point_data[index].data[ND*tris[NT*i + j] as usize + 0], 383 | m.point_data[index].data[ND*tris[NT*i + j] as usize + 1], 384 | m.point_data[index].data[ND*tris[NT*i + j] as usize + 2], 385 | )} 386 | else 387 | {( 388 | 0.0, 0.0, 0.0, 389 | )}; 390 | 391 | p[NT*j + 0] += factor * dx; 392 | p[NT*j + 1] += factor * dy; 393 | p[NT*j + 2] += factor * dz; 394 | 395 | verts.push(Vert{position: 396 | [ 397 | p[NT*j + 0], 398 | p[NT*j + 1], 399 | p[NT*j + 2], 400 | ]}); 401 | } 402 | 403 | let p01 = sub(&p[3..6], &p[0..3]); 404 | let p02 = sub(&p[6..9], &p[0..3]); 405 | 406 | let nrm = normalize(&cross(&p01, &p02)); 407 | 408 | // Use inward normal for RH coordinate system 409 | for _j in 0 .. ND 410 | { 411 | normals.push(Normal{normal: 412 | [ 413 | -nrm[0], 414 | -nrm[1], 415 | -nrm[2], 416 | ] 417 | }); 418 | } 419 | } 420 | 421 | //println!("vert 0 = {:?}", verts[0]); 422 | //println!("vert 1 = {:?}", verts[1]); 423 | //println!("vert 2 = {:?}", verts[2]); 424 | //println!("normal 0 = {:?}", normals[0]); 425 | 426 | let edges = m.edges(); 427 | let mut edge_verts = Vec::with_capacity(edges.len()); 428 | for i in 0 .. edges.len() / NE 429 | { 430 | // This could be half the size. Unlike normal calculation above, we 431 | // only need to push 1 vert at a time without keeping the whole edge 432 | // in memory. 433 | let mut p: [f32; NE * ND] = [0.0; NE * ND]; 434 | 435 | for j in 0 .. NE 436 | { 437 | p[NE*j + 0] = m.points[ND*edges[NE*i + j] as usize + 0]; 438 | p[NE*j + 1] = m.points[ND*edges[NE*i + j] as usize + 1]; 439 | p[NE*j + 2] = m.points[ND*edges[NE*i + j] as usize + 2]; 440 | 441 | let (dx, dy, dz) = if enable_warp 442 | {( 443 | m.point_data[index].data[ND*edges[NE*i + j] as usize + 0], 444 | m.point_data[index].data[ND*edges[NE*i + j] as usize + 1], 445 | m.point_data[index].data[ND*edges[NE*i + j] as usize + 2], 446 | )} 447 | else 448 | {( 449 | 0.0, 0.0, 0.0, 450 | )}; 451 | 452 | p[NE*j + 0] += factor * dx; 453 | p[NE*j + 1] += factor * dy; 454 | p[NE*j + 2] += factor * dz; 455 | 456 | // If we map edge to triangle, we could add a bit of the outward 457 | // normal to the edge position to fix z-fighting. Instead, just 458 | // increase polygon_offset and/or line_width in DrawParameters 459 | 460 | edge_verts.push(Vert{position: 461 | [ 462 | p[NE*j + 0],// + 0.001, 463 | p[NE*j + 1],// + 0.001, 464 | p[NE*j + 2],// + 0.001, 465 | ]}); 466 | } 467 | } 468 | 469 | (verts, normals, edge_verts) 470 | } 471 | 472 | impl RenderModel 473 | { 474 | //**************** 475 | 476 | pub fn new(m: Box, facade: Rc) -> RenderModel 477 | { 478 | // Split scalar handling to a separate fn. Mesh geometry will only be 479 | // loaded once, but scalars are processed multiple times as the user 480 | // cycles through data to display 481 | 482 | let enable_warp = false; 483 | let (verts, normals, edge_verts) = verts(&m, enable_warp, 0, 0.0); 484 | 485 | let scalar = Vec::new(); 486 | let mut render_model = RenderModel 487 | { 488 | // "x.deref()" is equivalent to "&*x" 489 | vertices: glium::VertexBuffer::new(facade.deref(), &verts ).unwrap(), 490 | normals : glium::VertexBuffer::new(facade.deref(), &normals).unwrap(), 491 | scalar : glium::VertexBuffer::new(facade.deref(), &scalar ).unwrap(), 492 | 493 | indices : glium::index::NoIndices( 494 | glium::index::PrimitiveType::TrianglesList), 495 | 496 | edge_visibility: false, 497 | edge_verts : glium::VertexBuffer::new(facade.deref(), &edge_verts).unwrap(), 498 | edge_indices: glium::index::NoIndices( 499 | glium::index::PrimitiveType::LinesList), 500 | 501 | warp_factor: 1.0, 502 | 503 | // Data array index for warping by vector. Initial value means no 504 | // warping 505 | warp_index: m.point_data.len(), 506 | 507 | comp : 0, 508 | dindex: 0, 509 | 510 | // Don't scale or translate here. Model matrix should always be 511 | // identity unless I add an option for a user to move one model 512 | // relative to others 513 | mat: identity_matrix(), 514 | 515 | m: m, 516 | facade: facade, 517 | }; 518 | 519 | // If point data is empty, bind cell data instead. If both are empty, 520 | // panic. Otherwise, main will crash at my target_draw() call which 521 | // references the empty scalar 522 | if render_model.m.point_data.len() > 0 523 | { 524 | render_model.bind_point_data(); 525 | } 526 | else if render_model.m.cell_data.len() > 0 527 | { 528 | render_model.bind_cell_data(); 529 | } 530 | else 531 | { 532 | unimplemented!("Point data and cell data are both empty. \ 533 | Geometry-only models cannot be rendered"); 534 | } 535 | 536 | render_model 537 | } 538 | 539 | //**************** 540 | 541 | pub fn warp(&mut self) 542 | { 543 | // Warp vertex positions by vector point data. Cell data cannot be 544 | // applied as a warp. 545 | // 546 | // Unlike ParaView, warping does not reset the color contour to 547 | // a different data array. Instead, we maintain the same scalar texture 548 | // as before. 549 | 550 | //index += 1; 551 | if self.warp_index >= self.m.point_data.len() + 1 552 | { 553 | self.warp_index = 0; 554 | } 555 | 556 | let index = self.warp_index; 557 | 558 | // We can't just return early here, because we need to reset positions 559 | // to their original values to undo the previous warp 560 | let enable_warp = index < self.m.point_data.len(); 561 | 562 | if enable_warp 563 | { 564 | if self.m.point_data[index].num_comp != ND 565 | { 566 | // Only vectors can warp. TODO: auto cycle to next vector (don't 567 | // infinite loop) 568 | return; 569 | } 570 | 571 | //println!("Warping by \"{}\"", self.m.point_data[index].name); 572 | } 573 | 574 | let (verts, normals, edge_verts) = verts(&self.m, enable_warp, 575 | index, self.warp_factor); 576 | 577 | self.vertices = glium::VertexBuffer::new(self.facade.deref(), &verts ).unwrap(); 578 | self.normals = glium::VertexBuffer::new(self.facade.deref(), &normals ).unwrap(); 579 | self.edge_verts = glium::VertexBuffer::new(self.facade.deref(), &edge_verts).unwrap(); 580 | } 581 | 582 | //**************** 583 | 584 | pub fn bind_point_data(&mut self) 585 | { 586 | // Select point data array by index to bind for graphical display 587 | 588 | let index = self.dindex; 589 | 590 | // TODO: check index too 591 | if self.comp >= self.m.point_data[index].num_comp 592 | { 593 | panic!("Component is out of bounds"); 594 | } 595 | 596 | let tris = self.m.tris(); 597 | let mut scalar = Vec::with_capacity(tris.len()); 598 | let step = self.m.point_data[index].num_comp; 599 | 600 | // Get min/max of scalar. TODO: add a magnitude option for vectors (but 601 | // not tensors). An extra pass will be needed to calculate 602 | let (smin, smax) = utils::get_bounds(&(self.m.point_data[index].data 603 | .iter().skip(self.comp).step_by(step).copied().collect::>())); 604 | 605 | for i in 0 .. tris.len() 606 | { 607 | let s = self.m.point_data[index].data[step * tris[i] as usize + self.comp]; 608 | 609 | scalar.push(Scalar{tex_coord: 610 | ((s - smin) / (smax - smin)) as f32 }); 611 | } 612 | 613 | self.scalar = glium::VertexBuffer::new(self.facade.deref(), &scalar).unwrap(); 614 | } 615 | 616 | //**************** 617 | 618 | pub fn bind_cell_data(&mut self) 619 | { 620 | // Select cell data array by index to bind for graphical display 621 | 622 | let index = self.dindex - self.m.point_data.len(); 623 | 624 | // TODO: check index too 625 | if self.comp >= self.m.cell_data[index].num_comp 626 | { 627 | panic!("Component is out of bounds"); 628 | } 629 | 630 | let tris = self.m.tris(); 631 | let mut scalar = Vec::with_capacity(tris.len()); 632 | let step = self.m.cell_data[index].num_comp; 633 | 634 | // Get min/max of scalar. TODO: add a magnitude option for vectors (but 635 | // not tensors). An extra pass will be needed to calculate 636 | let (smin, smax) = utils::get_bounds(&(self.m.cell_data[index].data 637 | .iter().skip(self.comp).step_by(step).copied().collect::>())); 638 | 639 | // Cell index 640 | let mut ic = 0; 641 | 642 | // Duplicated vert index within cell 643 | let mut iv = 0; 644 | 645 | // Number of duplicated verts in this cell (recall: verts are duplicated 646 | // for each triangle they belong too, both for sharp shading display 647 | // along edges, and here for per-cell scalar display) 648 | let mut nvc = cell_tris(self.m.types[ic]).len(); 649 | 650 | for _i in 0 .. tris.len() 651 | { 652 | if iv >= nvc 653 | { 654 | iv = 0; 655 | ic += 1; 656 | nvc = cell_tris(self.m.types[ic]).len(); 657 | } 658 | //println!("_i, ic, iv = {}, {}, {}", _i, ic, iv); 659 | 660 | let s = self.m.cell_data[index].data[step * ic as usize + self.comp]; 661 | 662 | scalar.push(Scalar{tex_coord: 663 | ((s - smin) / (smax - smin)) as f32 }); 664 | 665 | iv += 1; 666 | } 667 | 668 | self.scalar = glium::VertexBuffer::new(self.facade.deref(), &scalar).unwrap(); 669 | } 670 | 671 | //**************** 672 | } 673 | 674 | //============================================================================== 675 | 676 | pub fn import(f: std::path::PathBuf) -> Model 677 | { 678 | println!("Importing VTK file \"{}\"", f.display()); 679 | println!(); 680 | 681 | let vtk = Vtk::import(&f).expect(&format!( 682 | "Failed to load file: {:?}", f)); 683 | 684 | //let file_out = PathBuf::from("./scratch/ascii.vtu"); 685 | //vtk.export_ascii(&file_out) 686 | // .expect(&format!("Failed to save file: {:?}", file_out)); 687 | //return; 688 | 689 | // TODO: match UnstructuredGrid vs PolyData, etc. 690 | // 691 | // VTK polydata files (or other piece types) can be saved as 692 | // UnstructuredGrid (.vtu) in ParaView with Filters -> Alphabetical -> 693 | // Append datasets, in the mean time until I implement polydata natively 694 | // here 695 | let pieces = if let DataSet::UnstructuredGrid { pieces, ..} = vtk.data 696 | { 697 | pieces 698 | } 699 | else 700 | { 701 | panic!("UnstructuredGrid not found. Wrong vtk data type"); 702 | }; 703 | 704 | println!("Number of pieces = {}", pieces.len()); 705 | 706 | if pieces.len() > 1 707 | { 708 | // To do? Render each piece as if it's a totally separate VTK file. 709 | // They could have unrelated numbers of points, number and type of 710 | // data arrays, etc. 711 | unimplemented!("multiple pieces"); 712 | } 713 | 714 | let piece = pieces[0].load_piece_data(None).unwrap(); 715 | let num_points = piece.num_points(); 716 | 717 | println!("Number of points = {}", num_points); 718 | println!("Number of cells = {}", piece.cells.types.len()); 719 | println!(); 720 | 721 | //let points = piece.points.cast_into::().unwrap(); 722 | //m.points = points; 723 | 724 | // TODO: instead of making a new empty Model here and setting members one at 725 | // a time, set them all at the end (like RenderModel) and eliminate the 726 | // new() fn 727 | let mut m = Model::new(); 728 | 729 | m.points = piece.points.cast_into::().unwrap(); 730 | 731 | //println!("m.points = {:?}", m.points); 732 | //println!(); 733 | 734 | // Convert legacy into XML so we don't have to match conditionally 735 | let cells = piece.cells.cell_verts.into_xml(); 736 | 737 | //println!("connectivity = {:?}", cells.0); 738 | //println!("types = {:?}", piece.cells.types); 739 | //println!("offsets = {:?}", cells.1); 740 | //println!(); 741 | 742 | // In vtkio, cells.0 is the actual connectivity, and cells.1 is the offset 743 | m.cells = cells.0; 744 | m.offsets = cells.1; 745 | 746 | //m.types = piece.cells.types; 747 | 748 | // Abstract away from vtkio's type enum 749 | m.types = Vec::with_capacity(piece.cells.types.len()); 750 | for t in piece.cells.types 751 | { 752 | m.types.push(match t 753 | { 754 | vtkio::model::CellType::Triangle => Type::Tri, 755 | vtkio::model::CellType::Quad => Type::Quad, 756 | vtkio::model::CellType::Hexahedron => Type::Hex, 757 | vtkio::model::CellType::Wedge => Type::Wedge, 758 | vtkio::model::CellType::Pyramid => Type::Pyramid, 759 | 760 | //vtkio::model::CellType::Line => Type::Unsupported, 761 | //vtkio::model::CellType::PolyVertex => Type::Unsupported, 762 | //vtkio::model::CellType::Vertex => Type::Unsupported, 763 | 764 | _ => Type::Invalid, 765 | }); 766 | } 767 | 768 | //println!("point 0 = {:?}", piece.data.point[0]); 769 | //println!(); 770 | 771 | //let mut name: String = "".to_string(); 772 | 773 | m.point_data = data(&piece.data.point, num_points); 774 | m. cell_data = data(&piece.data.cell , num_points); 775 | 776 | m 777 | } 778 | 779 | //============================================================================== 780 | 781 | fn data(attribs: &Vec, num: usize) -> Vec 782 | { 783 | // Return val. This could be either point data or cell data 784 | let mut data_vec = Vec::new(); 785 | 786 | // Iterate attributes like this to get all data 787 | for attrib in attribs 788 | { 789 | println!("Attribute:"); 790 | //println!("attrib = {:?}", attrib); 791 | 792 | // Get the contents of the point/cell data array. This is based on 793 | // write_attrib() from vtkio/src/writer.rs 794 | 795 | match attrib 796 | { 797 | Attribute::DataArray(DataArray {elem, data, name}) => 798 | { 799 | let data_len = data.len(); 800 | match elem 801 | { 802 | ElementType::Scalars{num_comp, ..} 803 | => 804 | { 805 | println!("Scalars"); 806 | 807 | // Cast everything to f32 808 | 809 | data_vec.push(Data 810 | { 811 | name: name.to_string(), 812 | data: data.clone().cast_into::().unwrap(), 813 | num_comp: *num_comp as usize, 814 | }); 815 | } 816 | 817 | ElementType::Vectors{} 818 | => 819 | { 820 | // Vector num_comp should always be 3, but calculate it 821 | // anyway 822 | println!("Vectors"); 823 | data_vec.push(Data 824 | { 825 | name: name.to_string(), 826 | data: data.clone().cast_into::().unwrap(), 827 | num_comp: data_len / num, 828 | }); 829 | } 830 | 831 | ElementType::Tensors{} 832 | => 833 | { 834 | // Tensor num_comp may be 6 or 9 835 | println!("Tensors"); 836 | data_vec.push(Data 837 | { 838 | name: name.to_string(), 839 | data: data.clone().cast_into::().unwrap(), 840 | num_comp: data_len / num, 841 | }); 842 | } 843 | 844 | ElementType::Generic(num_comp) 845 | => 846 | { 847 | println!("Generic"); 848 | data_vec.push(Data 849 | { 850 | name: name.to_string(), 851 | data: data.clone().cast_into::().unwrap(), 852 | num_comp: *num_comp as usize, 853 | }); 854 | } 855 | 856 | //ElementType::ColorScalars{..} 857 | //=> 858 | //{ 859 | // println!("ColorScalars"); 860 | //} 861 | 862 | //ElementType::LookupTable{..} 863 | //=> 864 | //{ 865 | // println!("LookupTable"); 866 | //} 867 | 868 | //ElementType::Normals{..} 869 | //=> 870 | //{ 871 | // println!("Normals"); 872 | //} 873 | 874 | //ElementType::TCoords{..} 875 | //=> 876 | //{ 877 | // println!("TCoords"); 878 | //} 879 | 880 | // Just ignore and don't push anything that I haven't 881 | // handled 882 | _ => () 883 | } 884 | } 885 | Attribute::Field {..} 886 | => unimplemented!("Field attribute for point/cell data") 887 | }; 888 | println!(); 889 | } 890 | 891 | // TODO: display name in legend. Apparently I need another crate for GL 892 | // text display 893 | 894 | println!("data_vec.len() = {}", data_vec.len()); 895 | for d in &data_vec 896 | { 897 | println!("\tname = {}", d.name); 898 | println!("\tnum_comp = {}", d.num_comp); 899 | println!("\tlen = {}", d.data.len()); 900 | println!(); 901 | } 902 | 903 | data_vec 904 | } 905 | 906 | //============================================================================== 907 | 908 | -------------------------------------------------------------------------------- /src/shaders.rs: -------------------------------------------------------------------------------- 1 | 2 | const EDGE: &str = include_str!("./edge.glsl"); 3 | const FRAG: &str = include_str!("./frag.glsl"); 4 | const VERT: &str = include_str!("./vert.glsl"); 5 | 6 | // TODO: add Gouraud option in addition to current Blinn-Phong frag shader 7 | 8 | pub fn edge(facade: &dyn glium::backend::Facade) -> glium::Program 9 | { 10 | glium::Program::from_source(facade, VERT, EDGE, None).unwrap() 11 | } 12 | 13 | pub fn face(facade: &dyn glium::backend::Facade) -> glium::Program 14 | { 15 | glium::Program::from_source(facade, VERT, FRAG, None).unwrap() 16 | } 17 | 18 | -------------------------------------------------------------------------------- /src/utils.rs: -------------------------------------------------------------------------------- 1 | 2 | use std::env; 3 | 4 | //============================================================================== 5 | 6 | pub fn get_exe_base(default: &str) -> String 7 | { 8 | // Safely get the basename of this exe or return a default 9 | 10 | let current_exe = match env::current_exe().ok() 11 | { 12 | Some(inner) => inner, 13 | None => return default.to_string(), 14 | }; 15 | let file_name = match current_exe.file_name() 16 | { 17 | Some(inner) => inner, 18 | None => return default.to_string(), 19 | }; 20 | match file_name.to_str() 21 | { 22 | Some(inner) => inner.to_string(), 23 | None => default.to_string(), 24 | } 25 | } 26 | 27 | //============================================================================== 28 | 29 | pub fn get_bounds(x: &[f32]) -> (f32, f32) 30 | { 31 | // Does this belong in utils or math? 32 | // 33 | // This may not handle NaN correctly 34 | 35 | let mut xmin = x[0]; 36 | let mut xmax = x[0]; 37 | for i in 1 .. x.len() 38 | { 39 | if x[i] < xmin { xmin = x[i]; } 40 | if x[i] > xmax { xmax = x[i]; } 41 | } 42 | (xmin, xmax) 43 | } 44 | 45 | //============================================================================== 46 | 47 | pub fn ff32(num: f32) -> String 48 | { 49 | // Format float in scientific notation for tabular output 50 | // 51 | // Rust doesn't do optional args, so we have 2 fn's instead 52 | fmt_f32(num, 12, 5, 2) 53 | } 54 | 55 | pub fn fmt_f32(num: f32, width: usize, precision: usize, exp_width: usize) 56 | -> String 57 | { 58 | // https://stackoverflow.com/questions/65264069/alignment-of-floating-point-numbers-printed-in-scientific-notation 59 | 60 | let mut num = format!("{:.precision$e}", num, precision = precision); 61 | 62 | // Safe to `unwrap` as `num` is guaranteed to contain `'e'` 63 | let exp = num.split_off(num.find('e').unwrap()); 64 | 65 | let (sign, exp) = if exp.starts_with("e-") 66 | { 67 | ('-', &exp[2..]) 68 | } 69 | else 70 | { 71 | ('+', &exp[1..]) 72 | }; 73 | num.push_str(&format!("e{}{:0>pad$}", sign, exp, pad = exp_width)); 74 | 75 | format!("{:>width$}", num, width = width) 76 | } 77 | 78 | //============================================================================== 79 | 80 | -------------------------------------------------------------------------------- /src/vert.glsl: -------------------------------------------------------------------------------- 1 | 2 | #version 150 3 | 4 | in vec3 position; 5 | in vec3 normal; 6 | in float tex_coord; 7 | 8 | out vec3 v_normal; 9 | out vec3 v_position; 10 | out float v_tex_coord; 11 | 12 | uniform mat4 perspective; 13 | uniform mat4 view; 14 | uniform mat4 model_mat; 15 | uniform mat4 world; 16 | 17 | void main() 18 | { 19 | v_tex_coord = tex_coord; 20 | mat4 modelview = view * world * model_mat; 21 | v_normal = transpose(inverse(mat3(modelview))) * normal; 22 | gl_Position = perspective * modelview * vec4(position, 1.0); 23 | v_position = gl_Position.xyz / gl_Position.w; 24 | } 25 | 26 | -------------------------------------------------------------------------------- /utils/genhex.py: -------------------------------------------------------------------------------- 1 | 2 | # Make an unstructured grid of hex cells in legacy VTK format. This can be 3 | # opened in ParaView to save as XML format (.vtu). 4 | 5 | npx = 4 6 | npy = 5 7 | npz = 6 8 | 9 | ncx = npx - 1 10 | ncy = npy - 1 11 | ncz = npz - 1 12 | 13 | nxy = npx * npy 14 | np = npx * npy * npz 15 | nc = ncx * ncy * ncz 16 | 17 | # num points per cell 18 | nppc = 8 19 | 20 | csize = (nppc + 1) * nc 21 | 22 | f = open("./scratch/hex.vtk", "w") 23 | 24 | print("# vtk DataFile Version 2.0", file = f) 25 | print("Really cool data", file = f) 26 | print("ASCII", file = f) 27 | print("DATASET UNSTRUCTURED_GRID", file = f) 28 | 29 | print(f"POINTS {np} float", file = f) 30 | for k in range(0, npz): 31 | for j in range(0, npy): 32 | for i in range(0, npx): 33 | print(f"{i} {j} {k}", file = f) 34 | 35 | print(f"CELLS {nc} {csize}", file = f) 36 | for k in range(0, ncz): 37 | for j in range(0, ncy): 38 | for i in range(0, ncx): 39 | 40 | # Ref: http://www.princeton.edu/~efeibush/viscourse/vtk.pdf 41 | i0 = (k+0) * nxy + (j+0) * npx + (i+0) 42 | i1 = (k+0) * nxy + (j+0) * npx + (i+1) 43 | i2 = (k+0) * nxy + (j+1) * npx + (i+1) 44 | i3 = (k+0) * nxy + (j+1) * npx + (i+0) 45 | i4 = (k+1) * nxy + (j+0) * npx + (i+0) 46 | i5 = (k+1) * nxy + (j+0) * npx + (i+1) 47 | i6 = (k+1) * nxy + (j+1) * npx + (i+1) 48 | i7 = (k+1) * nxy + (j+1) * npx + (i+0) 49 | 50 | print(f"{nppc} {i0} {i1} {i2} {i3} {i4} {i5} {i6} {i7}", file = f) 51 | 52 | print(f"CELL_TYPES {nc}", file = f) 53 | for i in range(0, nc): 54 | print("12", file = f) 55 | 56 | -------------------------------------------------------------------------------- /utils/genhsv.py: -------------------------------------------------------------------------------- 1 | 2 | # Utility script for generating an HSV colormap 3 | # 4 | # Run: 5 | # 6 | # python3 genhsv.py 7 | # 8 | import sys 9 | 10 | cmax = 255 11 | 12 | for i in range(0, cmax + 1): 13 | r = 0 14 | g = i 15 | b = cmax 16 | print(f"{r}u8, {g}u8, {b}u8, {cmax}u8,") 17 | 18 | for i in range(0, cmax + 1): 19 | r = 0 20 | g = cmax 21 | b = cmax - i 22 | print(f"{r}u8, {g}u8, {b}u8, {cmax}u8,") 23 | 24 | for i in range(0, cmax + 1): 25 | r = i 26 | g = cmax 27 | b = 0 28 | print(f"{r}u8, {g}u8, {b}u8, {cmax}u8,") 29 | 30 | for i in range(0, cmax + 1): 31 | r = cmax 32 | g = cmax - i 33 | b = 0 34 | print(f"{r}u8, {g}u8, {b}u8, {cmax}u8,") 35 | 36 | --------------------------------------------------------------------------------