[{"data":1,"prerenderedAt":4052},["ShallowReactive",2],{"navigation-docsPy":3,"lib-picker-navigation":178,"docsPy-\u002Fpy\u002Fmodules\u002Fvolume":444,"docsPy-\u002Fpy\u002Fmodules\u002Fvolume-surround":4047},[4],{"title":5,"path":6,"stem":7,"children":8,"page":32},"Py","\u002Fpy","py",[9,33,105,110,132,159],{"title":10,"path":11,"stem":12,"children":13,"icon":32},"Getting Started","\u002Fpy\u002Fgetting-started","py\u002F1.getting-started\u002F1.index",[14,17,22,27],{"title":15,"path":11,"stem":12,"icon":16},"Introduction","i-lucide-house",{"title":18,"path":19,"stem":20,"icon":21},"Installation","\u002Fpy\u002Fgetting-started\u002Finstallation","py\u002F1.getting-started\u002F2.installation","i-lucide-download",{"title":23,"path":24,"stem":25,"icon":26},"Live Examples","\u002Fpy\u002Fgetting-started\u002Flive-examples","py\u002F1.getting-started\u002F3.live-examples","i-lucide-play",{"title":28,"path":29,"stem":30,"icon":31},"Release Notes","\u002Fpy\u002Fgetting-started\u002Frelease-notes","py\u002F1.getting-started\u002F4.release-notes","i-lucide-sparkles",false,{"title":34,"path":35,"stem":36,"children":37,"icon":32},"Modules","\u002Fpy\u002Fmodules","py\u002F2.modules\u002F00.index",[38,41,46,51,56,61,66,71,76,81,86,90,95,100],{"title":39,"path":35,"stem":36,"icon":40},"Overview","i-lucide-library",{"title":42,"path":43,"stem":44,"icon":45},"Core","\u002Fpy\u002Fmodules\u002Fcore","py\u002F2.modules\u002F01.core","i-lucide-atom",{"title":47,"path":48,"stem":49,"icon":50},"Spatial","\u002Fpy\u002Fmodules\u002Fspatial","py\u002F2.modules\u002F02.spatial","i-lucide-scale-3d",{"title":52,"path":53,"stem":54,"icon":55},"Topology","\u002Fpy\u002Fmodules\u002Ftopology","py\u002F2.modules\u002F03.topology","i-lucide-git-graph",{"title":57,"path":58,"stem":59,"icon":60},"Geometry","\u002Fpy\u002Fmodules\u002Fgeometry","py\u002F2.modules\u002F04.geometry","i-lucide-ruler",{"title":62,"path":63,"stem":64,"icon":65},"Remesh","\u002Fpy\u002Fmodules\u002Fremesh","py\u002F2.modules\u002F05.remesh","i-lucide-triangle",{"title":67,"path":68,"stem":69,"icon":70},"Intersect","\u002Fpy\u002Fmodules\u002Fintersect","py\u002F2.modules\u002F06.intersect","i-lucide-squares-intersect",{"title":72,"path":73,"stem":74,"icon":75},"Arrangement","\u002Fpy\u002Fmodules\u002Farrangement","py\u002F2.modules\u002F07.arrangement","i-lucide-scissors",{"title":77,"path":78,"stem":79,"icon":80},"Iso","\u002Fpy\u002Fmodules\u002Fiso","py\u002F2.modules\u002F08.iso","i-lucide-waves",{"title":82,"path":83,"stem":84,"icon":85},"CSG","\u002Fpy\u002Fmodules\u002Fcsg","py\u002F2.modules\u002F09.csg","i-lucide-shapes",{"title":87,"path":88,"stem":89,"icon":31},"Clean","\u002Fpy\u002Fmodules\u002Fclean","py\u002F2.modules\u002F10.clean",{"title":91,"path":92,"stem":93,"icon":94},"Reindex","\u002Fpy\u002Fmodules\u002Freindex","py\u002F2.modules\u002F11.reidx","i-lucide-shuffle",{"title":96,"path":97,"stem":98,"icon":99},"I\u002FO","\u002Fpy\u002Fmodules\u002Fio","py\u002F2.modules\u002F12.io","i-lucide-file-input",{"title":101,"path":102,"stem":103,"icon":104},"Volume","\u002Fpy\u002Fmodules\u002Fvolume","py\u002F2.modules\u002F13.volume","i-lucide-box",{"title":106,"path":107,"stem":108,"icon":109},"Benchmarks","\u002Fpy\u002Fbenchmarks","py\u002F3.benchmarks","i-lucide-chart-bar-stacked",{"title":111,"path":112,"stem":113,"children":114,"icon":32},"Blender","\u002Fpy\u002Fblender","py\u002F4.blender\u002F1.index",[115,117,122,127],{"title":39,"path":112,"stem":113,"icon":116},"i-vscode-icons:file-type-blender",{"title":118,"path":119,"stem":120,"icon":121},"Convert","\u002Fpy\u002Fblender\u002Fconvert","py\u002F4.blender\u002F2.convert","i-lucide-repeat",{"title":123,"path":124,"stem":125,"icon":126},"Scene","\u002Fpy\u002Fblender\u002Fscene","py\u002F4.blender\u002F3.scene","i-lucide-layers",{"title":128,"path":129,"stem":130,"icon":131},"Plugin Architecture","\u002Fpy\u002Fblender\u002Fplugin","py\u002F4.blender\u002F4.plugin","i-lucide-puzzle",{"title":133,"path":134,"stem":135,"children":136,"icon":32},"Examples","\u002Fpy\u002Fexamples","py\u002F5.examples\u002F0.index",[137,139,144,149,154],{"title":39,"path":134,"stem":135,"icon":138},"i-lucide-book-open",{"title":140,"path":141,"stem":142,"icon":143},"Core Functionality","\u002Fpy\u002Fexamples\u002Fcore-functionality","py\u002F5.examples\u002F2.core-functionality","i-lucide-code",{"title":145,"path":146,"stem":147,"icon":148},"Booleans and Domains from One Build","\u002Fpy\u002Fexamples\u002Farrangements","py\u002F5.examples\u002F3.arrangements","i-lucide-layers-3",{"title":150,"path":151,"stem":152,"icon":153},"VTK Integration","\u002Fpy\u002Fexamples\u002Fvtk-integration","py\u002F5.examples\u002F4.vtk-integration","i-lucide-grid-2x2",{"title":155,"path":156,"stem":157,"icon":158},"Raycast Rendering","\u002Fpy\u002Fexamples\u002Fraycast-rendering","py\u002F5.examples\u002F5.raycast-rendering","i-lucide-scan-line",{"title":160,"path":161,"stem":162,"children":163,"page":32},"About","\u002Fpy\u002Fabout","py\u002F6.about",[164,168,173],{"title":165,"path":166,"stem":167,"icon":138},"Research","\u002Fpy\u002Fabout\u002Fresearch","py\u002F6.about\u002F1.research",{"title":169,"path":170,"stem":171,"icon":172},"Contributing","\u002Fpy\u002Fabout\u002Fcontributing","py\u002F6.about\u002F2.contributing","i-lucide-heart-handshake",{"title":174,"path":175,"stem":176,"icon":177},"License","\u002Fpy\u002Fabout\u002Flicense","py\u002F6.about\u002F3.license","i-lucide-file-text",{"cpp":179,"py":306,"ts":350},[180],{"title":181,"path":182,"stem":183,"children":184,"page":32},"Cpp","\u002Fcpp","cpp",[185,199,243,246,268,293],{"title":10,"path":186,"stem":187,"children":188,"icon":32},"\u002Fcpp\u002Fgetting-started","cpp\u002F1.getting-started\u002F1.index",[189,190,193,196],{"title":15,"path":186,"stem":187,"icon":16},{"title":18,"path":191,"stem":192,"icon":21},"\u002Fcpp\u002Fgetting-started\u002Finstallation","cpp\u002F1.getting-started\u002F2.installation",{"title":23,"path":194,"stem":195,"icon":26},"\u002Fcpp\u002Fgetting-started\u002Flive-examples","cpp\u002F1.getting-started\u002F3.live-examples",{"title":28,"path":197,"stem":198,"icon":31},"\u002Fcpp\u002Fgetting-started\u002Frelease-notes","cpp\u002F1.getting-started\u002F4.release-notes",{"title":34,"path":200,"stem":201,"children":202,"icon":32},"\u002Fcpp\u002Fmodules","cpp\u002F2.modules\u002F00.index",[203,204,207,210,213,216,219,222,225,228,231,234,237,240],{"title":39,"path":200,"stem":201,"icon":40},{"title":42,"path":205,"stem":206,"icon":45},"\u002Fcpp\u002Fmodules\u002Fcore","cpp\u002F2.modules\u002F01.core",{"title":47,"path":208,"stem":209,"icon":50},"\u002Fcpp\u002Fmodules\u002Fspatial","cpp\u002F2.modules\u002F02.spatial",{"title":52,"path":211,"stem":212,"icon":55},"\u002Fcpp\u002Fmodules\u002Ftopology","cpp\u002F2.modules\u002F03.topology",{"title":57,"path":214,"stem":215,"icon":60},"\u002Fcpp\u002Fmodules\u002Fgeometry","cpp\u002F2.modules\u002F04.geometry",{"title":62,"path":217,"stem":218,"icon":65},"\u002Fcpp\u002Fmodules\u002Fremesh","cpp\u002F2.modules\u002F05.remesh",{"title":67,"path":220,"stem":221,"icon":70},"\u002Fcpp\u002Fmodules\u002Fintersect","cpp\u002F2.modules\u002F06.intersect",{"title":72,"path":223,"stem":224,"icon":75},"\u002Fcpp\u002Fmodules\u002Farrangement","cpp\u002F2.modules\u002F07.arrangement",{"title":77,"path":226,"stem":227,"icon":80},"\u002Fcpp\u002Fmodules\u002Fiso","cpp\u002F2.modules\u002F08.iso",{"title":82,"path":229,"stem":230,"icon":85},"\u002Fcpp\u002Fmodules\u002Fcsg","cpp\u002F2.modules\u002F09.csg",{"title":87,"path":232,"stem":233,"icon":31},"\u002Fcpp\u002Fmodules\u002Fclean","cpp\u002F2.modules\u002F10.clean",{"title":91,"path":235,"stem":236,"icon":94},"\u002Fcpp\u002Fmodules\u002Freindex","cpp\u002F2.modules\u002F11.reidx",{"title":96,"path":238,"stem":239,"icon":99},"\u002Fcpp\u002Fmodules\u002Fio","cpp\u002F2.modules\u002F12.io",{"title":101,"path":241,"stem":242,"icon":104},"\u002Fcpp\u002Fmodules\u002Fvolume","cpp\u002F2.modules\u002F13.volume",{"title":106,"path":244,"stem":245,"icon":109},"\u002Fcpp\u002Fbenchmarks","cpp\u002F3.benchmarks",{"title":247,"path":248,"stem":249,"children":250,"icon":32},"VTK","\u002Fcpp\u002Fvtk","cpp\u002F4.vtk\u002F1.index",[251,252,255,260,265],{"title":39,"path":248,"stem":249,"icon":126},{"title":42,"path":253,"stem":254,"icon":45},"\u002Fcpp\u002Fvtk\u002Fcore","cpp\u002F4.vtk\u002F2.core",{"title":256,"path":257,"stem":258,"icon":259},"Functions","\u002Fcpp\u002Fvtk\u002Ffunctions","cpp\u002F4.vtk\u002F3.functions","i-lucide-function-square",{"title":261,"path":262,"stem":263,"icon":264},"Filters","\u002Fcpp\u002Fvtk\u002Ffilters","cpp\u002F4.vtk\u002F4.filters","i-lucide-filter",{"title":133,"path":266,"stem":267,"icon":26},"\u002Fcpp\u002Fvtk\u002Fexamples","cpp\u002F4.vtk\u002F5.examples",{"title":133,"path":269,"stem":270,"children":271,"icon":32},"\u002Fcpp\u002Fexamples","cpp\u002F5.examples\u002F0.index",[272,273,277,282,285,288],{"title":39,"path":269,"stem":270,"icon":138},{"title":274,"path":275,"stem":276,"icon":104},"Geometry Walkthrough","\u002Fcpp\u002Fexamples\u002Fmesh-assembly","cpp\u002F5.examples\u002F1.mesh-assembly",{"title":278,"path":279,"stem":280,"icon":281},"Point Cloud Alignment","\u002Fcpp\u002Fexamples\u002Falignment","cpp\u002F5.examples\u002F2.alignment","i-lucide-move",{"title":145,"path":283,"stem":284,"icon":148},"\u002Fcpp\u002Fexamples\u002Farrangements","cpp\u002F5.examples\u002F3.arrangements",{"title":150,"path":286,"stem":287,"icon":126},"\u002Fcpp\u002Fexamples\u002Fvtk","cpp\u002F5.examples\u002F4.vtk",{"title":289,"path":290,"stem":291,"icon":292},"Coming from Other Libraries","\u002Fcpp\u002Fexamples\u002Flibrary-comparisons","cpp\u002F5.examples\u002F5.library-comparisons","i-lucide-git-compare",{"title":160,"path":294,"stem":295,"children":296,"page":32},"\u002Fcpp\u002Fabout","cpp\u002F6.about",[297,300,303],{"title":165,"path":298,"stem":299,"icon":138},"\u002Fcpp\u002Fabout\u002Fresearch","cpp\u002F6.about\u002F1.research",{"title":169,"path":301,"stem":302,"icon":172},"\u002Fcpp\u002Fabout\u002Fcontributing","cpp\u002F6.about\u002F2.contributing",{"title":174,"path":304,"stem":305,"icon":177},"\u002Fcpp\u002Fabout\u002Flicense","cpp\u002F6.about\u002F3.license",[307],{"title":5,"path":6,"stem":7,"children":308,"page":32},[309,315,331,332,338,345],{"title":10,"path":11,"stem":12,"children":310,"icon":32},[311,312,313,314],{"title":15,"path":11,"stem":12,"icon":16},{"title":18,"path":19,"stem":20,"icon":21},{"title":23,"path":24,"stem":25,"icon":26},{"title":28,"path":29,"stem":30,"icon":31},{"title":34,"path":35,"stem":36,"children":316,"icon":32},[317,318,319,320,321,322,323,324,325,326,327,328,329,330],{"title":39,"path":35,"stem":36,"icon":40},{"title":42,"path":43,"stem":44,"icon":45},{"title":47,"path":48,"stem":49,"icon":50},{"title":52,"path":53,"stem":54,"icon":55},{"title":57,"path":58,"stem":59,"icon":60},{"title":62,"path":63,"stem":64,"icon":65},{"title":67,"path":68,"stem":69,"icon":70},{"title":72,"path":73,"stem":74,"icon":75},{"title":77,"path":78,"stem":79,"icon":80},{"title":82,"path":83,"stem":84,"icon":85},{"title":87,"path":88,"stem":89,"icon":31},{"title":91,"path":92,"stem":93,"icon":94},{"title":96,"path":97,"stem":98,"icon":99},{"title":101,"path":102,"stem":103,"icon":104},{"title":106,"path":107,"stem":108,"icon":109},{"title":111,"path":112,"stem":113,"children":333,"icon":32},[334,335,336,337],{"title":39,"path":112,"stem":113,"icon":116},{"title":118,"path":119,"stem":120,"icon":121},{"title":123,"path":124,"stem":125,"icon":126},{"title":128,"path":129,"stem":130,"icon":131},{"title":133,"path":134,"stem":135,"children":339,"icon":32},[340,341,342,343,344],{"title":39,"path":134,"stem":135,"icon":138},{"title":140,"path":141,"stem":142,"icon":143},{"title":145,"path":146,"stem":147,"icon":148},{"title":150,"path":151,"stem":152,"icon":153},{"title":155,"path":156,"stem":157,"icon":158},{"title":160,"path":161,"stem":162,"children":346,"page":32},[347,348,349],{"title":165,"path":166,"stem":167,"icon":138},{"title":169,"path":170,"stem":171,"icon":172},{"title":174,"path":175,"stem":176,"icon":177},[351],{"title":352,"path":353,"stem":354,"children":355,"page":32},"Ts","\u002Fts","ts",[356,370,411,414,431],{"title":10,"path":357,"stem":358,"children":359,"icon":32},"\u002Fts\u002Fgetting-started","ts\u002F1.getting-started\u002F1.index",[360,361,364,367],{"title":15,"path":357,"stem":358,"icon":16},{"title":18,"path":362,"stem":363,"icon":21},"\u002Fts\u002Fgetting-started\u002Finstallation","ts\u002F1.getting-started\u002F2.installation",{"title":23,"path":365,"stem":366,"icon":26},"\u002Fts\u002Fgetting-started\u002Flive-examples","ts\u002F1.getting-started\u002F3.live-examples",{"title":28,"path":368,"stem":369,"icon":31},"\u002Fts\u002Fgetting-started\u002Frelease-notes","ts\u002F1.getting-started\u002F4.release-notes",{"title":34,"path":371,"stem":372,"children":373,"icon":32},"\u002Fts\u002Fmodules","ts\u002F2.modules\u002F00.index",[374,375,378,381,384,387,390,393,396,399,402,405,408],{"title":39,"path":371,"stem":372,"icon":40},{"title":42,"path":376,"stem":377,"icon":45},"\u002Fts\u002Fmodules\u002Fcore","ts\u002F2.modules\u002F01.core",{"title":47,"path":379,"stem":380,"icon":50},"\u002Fts\u002Fmodules\u002Fspatial","ts\u002F2.modules\u002F02.spatial",{"title":52,"path":382,"stem":383,"icon":55},"\u002Fts\u002Fmodules\u002Ftopology","ts\u002F2.modules\u002F03.topology",{"title":57,"path":385,"stem":386,"icon":60},"\u002Fts\u002Fmodules\u002Fgeometry","ts\u002F2.modules\u002F04.geometry",{"title":62,"path":388,"stem":389,"icon":65},"\u002Fts\u002Fmodules\u002Fremesh","ts\u002F2.modules\u002F05.remesh",{"title":67,"path":391,"stem":392,"icon":70},"\u002Fts\u002Fmodules\u002Fintersect","ts\u002F2.modules\u002F06.intersect",{"title":72,"path":394,"stem":395,"icon":75},"\u002Fts\u002Fmodules\u002Farrangement","ts\u002F2.modules\u002F07.arrangement",{"title":77,"path":397,"stem":398,"icon":80},"\u002Fts\u002Fmodules\u002Fiso","ts\u002F2.modules\u002F08.iso",{"title":82,"path":400,"stem":401,"icon":85},"\u002Fts\u002Fmodules\u002Fcsg","ts\u002F2.modules\u002F09.csg",{"title":87,"path":403,"stem":404,"icon":31},"\u002Fts\u002Fmodules\u002Fclean","ts\u002F2.modules\u002F10.clean",{"title":91,"path":406,"stem":407,"icon":94},"\u002Fts\u002Fmodules\u002Freindex","ts\u002F2.modules\u002F11.reidx",{"title":96,"path":409,"stem":410,"icon":99},"\u002Fts\u002Fmodules\u002Fio","ts\u002F2.modules\u002F12.io",{"title":106,"path":412,"stem":413,"icon":109},"\u002Fts\u002Fbenchmarks","ts\u002F3.benchmarks",{"title":133,"path":415,"stem":416,"children":417,"icon":32},"\u002Fts\u002Fexamples","ts\u002F4.examples\u002F0.index",[418,419,422,427],{"title":39,"path":415,"stem":416,"icon":138},{"title":140,"path":420,"stem":421,"icon":143},"\u002Fts\u002Fexamples\u002Fcore-functionality","ts\u002F4.examples\u002F2.core-functionality",{"title":423,"path":424,"stem":425,"icon":426},"Alignment","\u002Fts\u002Fexamples\u002Falignment","ts\u002F4.examples\u002F3.alignment","i-lucide-move-3d",{"title":155,"path":428,"stem":429,"icon":430},"\u002Fts\u002Fexamples\u002Fraycast-render","ts\u002F4.examples\u002F4.raycast-render","i-lucide-image",{"title":160,"icon":32,"path":432,"stem":433,"children":434,"page":32},"\u002Fts\u002Fabout","ts\u002F5.about",[435,438,441],{"title":165,"path":436,"stem":437,"icon":138},"\u002Fts\u002Fabout\u002Fresearch","ts\u002F5.about\u002F1.research",{"title":169,"path":439,"stem":440,"icon":172},"\u002Fts\u002Fabout\u002Fcontributing","ts\u002F5.about\u002F2.contributing",{"title":174,"path":442,"stem":443,"icon":177},"\u002Fts\u002Fabout\u002Flicense","ts\u002F5.about\u002F3.license",{"id":445,"title":101,"body":446,"description":4039,"extension":4040,"links":4041,"meta":4042,"navigation":4043,"path":102,"seo":4044,"sitemap":4045,"stem":103,"__hash__":4046},"docsPy\u002Fpy\u002F2.modules\u002F13.volume.md",{"type":447,"value":448,"toc":4014},"minimark",[449,453,495,629,776,782,786,1133,1234,1240,1246,1356,1361,1408,1411,1502,1509,1533,1537,1543,1622,1722,1732,1735,1749,1811,1839,1843,1846,1848,1933,2021,2027,2029,2219,2335,2338,2352,2369,2569,2578,2582,2584,2680,2784,2818,2821,2913,2917,2919,3013,3075,3130,3133,3148,3164,3169,3183,3345,3349,3351,3420,3495,3512,3516,3518,3671,3773,3787,3810,3851,3854,3858,3877,3964,3974,3978,4010],[450,451,452],"p",{},"The Volume module works on a dense scalar field sampled on a regular, axis-aligned voxel grid. It generates such a field from a mesh or an analytic solid, combines fields with CSG operators, slices one onto a plane, and extracts the geometry a field's level set names.",[454,455,460],"pre",{"className":456,"code":457,"language":458,"meta":459,"style":459},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import numpy as np\nimport trueform as tf\n","python","",[461,462,463,482],"code",{"__ignoreMap":459},[464,465,468,472,476,479],"span",{"class":466,"line":467},"line",1,[464,469,471],{"class":470},"s7zQu","import",[464,473,475],{"class":474},"sTEyZ"," numpy ",[464,477,478],{"class":470},"as",[464,480,481],{"class":474}," np\n",[464,483,485,487,490,492],{"class":466,"line":484},2,[464,486,471],{"class":470},[464,488,489],{"class":474}," trueform ",[464,491,478],{"class":470},[464,493,494],{"class":474}," tf\n",[496,497,498,514],"table",{},[499,500,501],"thead",{},[502,503,504,508,511],"tr",{},[505,506,507],"th",{},"Function",[505,509,510],{},"Returns",[505,512,513],{},"Does",[515,516,517,532,546,560,575,590,604],"tbody",{},[502,518,519,525,529],{},[520,521,522],"td",{},[461,523,524],{},"tf.sphere_sdf",[520,526,527],{},[461,528,101],{},[520,530,531],{},"The analytic sphere field",[502,533,534,539,543],{},[520,535,536],{},[461,537,538],{},"tf.mesh_sdf",[520,540,541],{},[461,542,101],{},[520,544,545],{},"The signed distance field of a closed mesh",[502,547,548,553,557],{},[520,549,550],{},[461,551,552],{},"tf.volume_boolean",[520,554,555],{},[461,556,101],{},[520,558,559],{},"Union \u002F intersection \u002F difference of two fields",[502,561,562,567,572],{},[520,563,564],{},[461,565,566],{},"tf.isosurface",[520,568,569],{},[461,570,571],{},"(faces, points)",[520,573,574],{},"The level set as a triangle mesh",[502,576,577,582,587],{},[520,578,579],{},[461,580,581],{},"tf.volume_slice_contours",[520,583,584],{},[461,585,586],{},"(paths, points)",[520,588,589],{},"Isocontours on an oriented slice plane, as 3D curves",[502,591,592,597,601],{},[520,593,594],{},[461,595,596],{},"tf.resampled_volume",[520,598,599],{},[461,600,101],{},[520,602,603],{},"The field regridded onto a stated grid",[502,605,606,615,622],{},[520,607,608,611,612],{},[461,609,610],{},"tf.read_nifti"," \u002F ",[461,613,614],{},"tf.write_nifti",[520,616,617,611,619],{},[461,618,101],{},[461,620,621],{},"bool",[520,623,624,625,628],{},"NIfTI-1 interchange (",[626,627,96],"a",{"href":97},")",[454,630,632],{"className":456,"code":631,"language":458,"meta":459,"style":459},"vol = tf.sphere_sdf((64, 64, 64), (0.1, 0.1, 0.1), (-3.2, -3.2, -3.2),\n                    (0.0, 0.0, 0.0), 1.5)\n\nfaces, points = tf.isosurface(vol)     # the zero level set\n",[461,633,634,712,737,744],{"__ignoreMap":459},[464,635,636,639,643,646,649,653,656,660,663,666,668,670,673,676,679,681,684,686,688,690,693,696,698,701,703,705,707,709],{"class":466,"line":467},[464,637,638],{"class":474},"vol ",[464,640,642],{"class":641},"sMK4o","=",[464,644,645],{"class":474}," tf",[464,647,648],{"class":641},".",[464,650,652],{"class":651},"s2Zo4","sphere_sdf",[464,654,655],{"class":641},"((",[464,657,659],{"class":658},"sbssI","64",[464,661,662],{"class":641},",",[464,664,665],{"class":658}," 64",[464,667,662],{"class":641},[464,669,665],{"class":658},[464,671,672],{"class":641},"),",[464,674,675],{"class":641}," (",[464,677,678],{"class":658},"0.1",[464,680,662],{"class":641},[464,682,683],{"class":658}," 0.1",[464,685,662],{"class":641},[464,687,683],{"class":658},[464,689,672],{"class":641},[464,691,692],{"class":641}," (-",[464,694,695],{"class":658},"3.2",[464,697,662],{"class":641},[464,699,700],{"class":641}," -",[464,702,695],{"class":658},[464,704,662],{"class":641},[464,706,700],{"class":641},[464,708,695],{"class":658},[464,710,711],{"class":641},"),\n",[464,713,714,717,720,722,725,727,729,731,734],{"class":466,"line":484},[464,715,716],{"class":641},"                    (",[464,718,719],{"class":658},"0.0",[464,721,662],{"class":641},[464,723,724],{"class":658}," 0.0",[464,726,662],{"class":641},[464,728,724],{"class":658},[464,730,672],{"class":641},[464,732,733],{"class":658}," 1.5",[464,735,736],{"class":641},")\n",[464,738,740],{"class":466,"line":739},3,[464,741,743],{"emptyLinePlaceholder":742},true,"\n",[464,745,747,750,752,755,757,759,761,764,767,770,772],{"class":466,"line":746},4,[464,748,749],{"class":474},"faces",[464,751,662],{"class":641},[464,753,754],{"class":474}," points ",[464,756,642],{"class":641},[464,758,645],{"class":474},[464,760,648],{"class":641},[464,762,763],{"class":651},"isosurface",[464,765,766],{"class":641},"(",[464,768,769],{"class":651},"vol",[464,771,628],{"class":641},[464,773,775],{"class":774},"sHwdD","     # the zero level set\n",[450,777,778,779,781],{},"A volume boolean is a sample-wise combine of two fields: exact on the zero level set and bound by the grid's resolution. The ",[626,780,82],{"href":83}," module's mesh boolean is exact everywhere and carries no resolution. Use fields when the input is already a field, when the shapes are offsets or blends, or when a self-intersecting input must be resolved by resampling; use CSG when the operands are meshes you want back unchanged.",[783,784,101],"h2",{"id":785},"volume",[454,787,789],{"className":456,"code":788,"language":458,"meta":459,"style":459},"x, y, z = np.meshgrid(np.arange(64.0), np.arange(64.0), np.arange(64.0),\n                      indexing=\"ij\")\nsdf = np.sqrt((x - 32)**2 + (y - 32)**2 + (z - 32)**2) - 12.0\n\nvol = tf.Volume(sdf.astype(np.float32), spacing=(0.1, 0.1, 0.1),\n                origin=(-3.2, -3.2, -3.2))\nvol.dims          # (64, 64, 64)\nvol.spacing       # one voxel step along x, y, z\nvol.origin        # local-space position of sample (0, 0, 0)\nvol.dtype         # dtype('float32')\nvol.voxel_count   # 262144\nvol.samples[10, 12, 14] = -0.5      # a view of the field, indexed [x, y, z]\n",[461,790,791,857,876,945,949,1002,1028,1041,1054,1067,1080,1093],{"__ignoreMap":459},[464,792,793,796,798,801,803,806,808,811,813,816,818,821,823,826,828,831,833,835,837,839,841,843,845,847,849,851,853,855],{"class":466,"line":467},[464,794,795],{"class":474},"x",[464,797,662],{"class":641},[464,799,800],{"class":474}," y",[464,802,662],{"class":641},[464,804,805],{"class":474}," z ",[464,807,642],{"class":641},[464,809,810],{"class":474}," np",[464,812,648],{"class":641},[464,814,815],{"class":651},"meshgrid",[464,817,766],{"class":641},[464,819,820],{"class":651},"np",[464,822,648],{"class":641},[464,824,825],{"class":651},"arange",[464,827,766],{"class":641},[464,829,830],{"class":658},"64.0",[464,832,672],{"class":641},[464,834,810],{"class":651},[464,836,648],{"class":641},[464,838,825],{"class":651},[464,840,766],{"class":641},[464,842,830],{"class":658},[464,844,672],{"class":641},[464,846,810],{"class":651},[464,848,648],{"class":641},[464,850,825],{"class":651},[464,852,766],{"class":641},[464,854,830],{"class":658},[464,856,711],{"class":641},[464,858,859,863,865,868,872,874],{"class":466,"line":484},[464,860,862],{"class":861},"sHdIc","                      indexing",[464,864,642],{"class":641},[464,866,867],{"class":641},"\"",[464,869,871],{"class":870},"sfazB","ij",[464,873,867],{"class":641},[464,875,736],{"class":641},[464,877,878,881,883,885,887,890,892,895,898,901,904,907,910,912,915,917,919,921,923,925,927,930,932,934,936,938,940,942],{"class":466,"line":739},[464,879,880],{"class":474},"sdf ",[464,882,642],{"class":641},[464,884,810],{"class":474},[464,886,648],{"class":641},[464,888,889],{"class":651},"sqrt",[464,891,655],{"class":641},[464,893,894],{"class":651},"x ",[464,896,897],{"class":641},"-",[464,899,900],{"class":658}," 32",[464,902,903],{"class":641},")**",[464,905,906],{"class":658},"2",[464,908,909],{"class":641}," +",[464,911,675],{"class":641},[464,913,914],{"class":651},"y ",[464,916,897],{"class":641},[464,918,900],{"class":658},[464,920,903],{"class":641},[464,922,906],{"class":658},[464,924,909],{"class":641},[464,926,675],{"class":641},[464,928,929],{"class":651},"z ",[464,931,897],{"class":641},[464,933,900],{"class":658},[464,935,903],{"class":641},[464,937,906],{"class":658},[464,939,628],{"class":641},[464,941,700],{"class":641},[464,943,944],{"class":658}," 12.0\n",[464,946,947],{"class":466,"line":746},[464,948,743],{"emptyLinePlaceholder":742},[464,950,952,954,956,958,960,962,964,967,969,972,974,976,978,982,984,987,990,992,994,996,998,1000],{"class":466,"line":951},5,[464,953,638],{"class":474},[464,955,642],{"class":641},[464,957,645],{"class":474},[464,959,648],{"class":641},[464,961,101],{"class":651},[464,963,766],{"class":641},[464,965,966],{"class":651},"sdf",[464,968,648],{"class":641},[464,970,971],{"class":651},"astype",[464,973,766],{"class":641},[464,975,820],{"class":651},[464,977,648],{"class":641},[464,979,981],{"class":980},"swJcz","float32",[464,983,672],{"class":641},[464,985,986],{"class":861}," spacing",[464,988,989],{"class":641},"=(",[464,991,678],{"class":658},[464,993,662],{"class":641},[464,995,683],{"class":658},[464,997,662],{"class":641},[464,999,683],{"class":658},[464,1001,711],{"class":641},[464,1003,1005,1008,1011,1013,1015,1017,1019,1021,1023,1025],{"class":466,"line":1004},6,[464,1006,1007],{"class":861},"                origin",[464,1009,1010],{"class":641},"=(-",[464,1012,695],{"class":658},[464,1014,662],{"class":641},[464,1016,700],{"class":641},[464,1018,695],{"class":658},[464,1020,662],{"class":641},[464,1022,700],{"class":641},[464,1024,695],{"class":658},[464,1026,1027],{"class":641},"))\n",[464,1029,1031,1033,1035,1038],{"class":466,"line":1030},7,[464,1032,769],{"class":474},[464,1034,648],{"class":641},[464,1036,1037],{"class":980},"dims",[464,1039,1040],{"class":774},"          # (64, 64, 64)\n",[464,1042,1044,1046,1048,1051],{"class":466,"line":1043},8,[464,1045,769],{"class":474},[464,1047,648],{"class":641},[464,1049,1050],{"class":980},"spacing",[464,1052,1053],{"class":774},"       # one voxel step along x, y, z\n",[464,1055,1057,1059,1061,1064],{"class":466,"line":1056},9,[464,1058,769],{"class":474},[464,1060,648],{"class":641},[464,1062,1063],{"class":980},"origin",[464,1065,1066],{"class":774},"        # local-space position of sample (0, 0, 0)\n",[464,1068,1070,1072,1074,1077],{"class":466,"line":1069},10,[464,1071,769],{"class":474},[464,1073,648],{"class":641},[464,1075,1076],{"class":980},"dtype",[464,1078,1079],{"class":774},"         # dtype('float32')\n",[464,1081,1083,1085,1087,1090],{"class":466,"line":1082},11,[464,1084,769],{"class":474},[464,1086,648],{"class":641},[464,1088,1089],{"class":980},"voxel_count",[464,1091,1092],{"class":774},"   # 262144\n",[464,1094,1096,1098,1100,1103,1106,1109,1111,1114,1116,1119,1122,1125,1127,1130],{"class":466,"line":1095},12,[464,1097,769],{"class":474},[464,1099,648],{"class":641},[464,1101,1102],{"class":980},"samples",[464,1104,1105],{"class":641},"[",[464,1107,1108],{"class":658},"10",[464,1110,662],{"class":641},[464,1112,1113],{"class":658}," 12",[464,1115,662],{"class":641},[464,1117,1118],{"class":658}," 14",[464,1120,1121],{"class":641},"]",[464,1123,1124],{"class":641}," =",[464,1126,700],{"class":641},[464,1128,1129],{"class":658},"0.5",[464,1131,1132],{"class":774},"      # a view of the field, indexed [x, y, z]\n",[496,1134,1135,1148],{},[499,1136,1137],{},[502,1138,1139,1142,1145],{},[505,1140,1141],{},"Parameter",[505,1143,1144],{},"Type",[505,1146,1147],{},"Description",[515,1149,1150,1172,1187,1204],{},[502,1151,1152,1156,1165],{},[520,1153,1154],{},[461,1155,1102],{},[520,1157,1158,1161,1162],{},[461,1159,1160],{},"np.ndarray"," shape ",[461,1163,1164],{},"(nx, ny, nz)",[520,1166,1167,1168,1171],{},"The field, indexed ",[461,1169,1170],{},"samples[x, y, z]",", dtype float32, float64, int16, uint16 or uint8. Any memory order; any other dtype is converted to float32",[502,1173,1174,1178,1181],{},[520,1175,1176],{},[461,1177,1050],{},[520,1179,1180],{},"sequence of 3 floats",[520,1182,1183,1184],{},"Physical size of one voxel step. Must be finite and positive. Default ",[461,1185,1186],{},"(1, 1, 1)",[502,1188,1189,1193,1195],{},[520,1190,1191],{},[461,1192,1063],{},[520,1194,1180],{},[520,1196,1197,1198,1201,1202],{},"Local-space position of sample ",[461,1199,1200],{},"(0, 0, 0)",". Default ",[461,1203,1200],{},[502,1205,1206,1211,1219],{},[520,1207,1208],{},[461,1209,1210],{},"transformation",[520,1212,1213,1161,1215,1218],{},[461,1214,1160],{},[461,1216,1217],{},"(4, 4)",", optional",[520,1220,1221,1222,675,1225,1229,1230,1233],{},"The world pose, in ",[461,1223,1224],{},"coordinate_dtype",[626,1226,1228],{"href":1227},"#transformations","Transformations","). Default ",[461,1231,1232],{},"None"," — unposed",[450,1235,1236,1237,648],{},"A sample's local-space position is ",[461,1238,1239],{},"origin + (x, y, z) * spacing",[450,1241,1242,1243,1245],{},"The samples are borrowed zero-copy when the array is already in the native layout — the module's own x-fastest order — so in-place writes through ",[461,1244,1102],{}," mutate the field. A C-ordered array (NumPy's default) is converted once at construction, and that converted array is what the volume then retains:",[454,1247,1249],{"className":456,"code":1248,"language":458,"meta":459,"style":459},"sdf = np.asfortranarray(sdf.astype(np.float32))   # borrowed, no copy\nvol = tf.Volume(sdf)\nvol.samples[0, 0, 0] = -1.0\nsdf[0, 0, 0]                                      # -1.0 — the same memory\n",[461,1250,1251,1286,1304,1335],{"__ignoreMap":459},[464,1252,1253,1255,1257,1259,1261,1264,1266,1268,1270,1272,1274,1276,1278,1280,1283],{"class":466,"line":467},[464,1254,880],{"class":474},[464,1256,642],{"class":641},[464,1258,810],{"class":474},[464,1260,648],{"class":641},[464,1262,1263],{"class":651},"asfortranarray",[464,1265,766],{"class":641},[464,1267,966],{"class":651},[464,1269,648],{"class":641},[464,1271,971],{"class":651},[464,1273,766],{"class":641},[464,1275,820],{"class":651},[464,1277,648],{"class":641},[464,1279,981],{"class":980},[464,1281,1282],{"class":641},"))",[464,1284,1285],{"class":774},"   # borrowed, no copy\n",[464,1287,1288,1290,1292,1294,1296,1298,1300,1302],{"class":466,"line":484},[464,1289,638],{"class":474},[464,1291,642],{"class":641},[464,1293,645],{"class":474},[464,1295,648],{"class":641},[464,1297,101],{"class":651},[464,1299,766],{"class":641},[464,1301,966],{"class":651},[464,1303,736],{"class":641},[464,1305,1306,1308,1310,1312,1314,1317,1319,1322,1324,1326,1328,1330,1332],{"class":466,"line":739},[464,1307,769],{"class":474},[464,1309,648],{"class":641},[464,1311,1102],{"class":980},[464,1313,1105],{"class":641},[464,1315,1316],{"class":658},"0",[464,1318,662],{"class":641},[464,1320,1321],{"class":658}," 0",[464,1323,662],{"class":641},[464,1325,1321],{"class":658},[464,1327,1121],{"class":641},[464,1329,1124],{"class":641},[464,1331,700],{"class":641},[464,1333,1334],{"class":658},"1.0\n",[464,1336,1337,1339,1341,1343,1345,1347,1349,1351,1353],{"class":466,"line":746},[464,1338,966],{"class":474},[464,1340,1105],{"class":641},[464,1342,1316],{"class":658},[464,1344,662],{"class":641},[464,1346,1321],{"class":658},[464,1348,662],{"class":641},[464,1350,1321],{"class":658},[464,1352,1121],{"class":641},[464,1354,1355],{"class":774},"                                      # -1.0 — the same memory\n",[1357,1358,1360],"h3",{"id":1359},"a-volumes-two-dtypes","A Volume's Two dtypes",[496,1362,1363,1373],{},[499,1364,1365],{},[502,1366,1367,1370],{},[505,1368,1369],{},"Property",[505,1371,1372],{},"The question it answers",[515,1374,1375,1389],{},[502,1376,1377,1381],{},[520,1378,1379],{},[461,1380,1076],{},[520,1382,1383,1384,1388],{},"What a sample ",[1385,1386,1387],"strong",{},"is"," — the measurement's own type",[502,1390,1391,1395],{},[520,1392,1393],{},[461,1394,1224],{},[520,1396,1397,1398,1401,1402,1404,1405,1407],{},"Where the samples ",[1385,1399,1400],{},"stand"," — the type ",[461,1403,1050],{},", ",[461,1406,1063],{}," and every emitted position answer in",[450,1409,1410],{},"They coincide for a real-valued field. They come apart where measurement and geometry have different natures — medical imaging, whose CT counts are int16 and whose grid is fractional millimetres:",[454,1412,1414],{"className":456,"code":1413,"language":458,"meta":459,"style":459},"ct = np.asfortranarray(counts)              # int16, e.g. Hounsfield units\nvol = tf.Volume(ct, spacing=(0.7, 0.7, 1.5))\n\nvol.dtype               # dtype('int16')   — borrowed, not one sample widened\nvol.coordinate_dtype    # dtype('float32') — 0.7 mm is not an int16\n",[461,1415,1416,1439,1476,1480,1491],{"__ignoreMap":459},[464,1417,1418,1421,1423,1425,1427,1429,1431,1434,1436],{"class":466,"line":467},[464,1419,1420],{"class":474},"ct ",[464,1422,642],{"class":641},[464,1424,810],{"class":474},[464,1426,648],{"class":641},[464,1428,1263],{"class":651},[464,1430,766],{"class":641},[464,1432,1433],{"class":651},"counts",[464,1435,628],{"class":641},[464,1437,1438],{"class":774},"              # int16, e.g. Hounsfield units\n",[464,1440,1441,1443,1445,1447,1449,1451,1453,1456,1458,1460,1462,1465,1467,1470,1472,1474],{"class":466,"line":484},[464,1442,638],{"class":474},[464,1444,642],{"class":641},[464,1446,645],{"class":474},[464,1448,648],{"class":641},[464,1450,101],{"class":651},[464,1452,766],{"class":641},[464,1454,1455],{"class":651},"ct",[464,1457,662],{"class":641},[464,1459,986],{"class":861},[464,1461,989],{"class":641},[464,1463,1464],{"class":658},"0.7",[464,1466,662],{"class":641},[464,1468,1469],{"class":658}," 0.7",[464,1471,662],{"class":641},[464,1473,733],{"class":658},[464,1475,1027],{"class":641},[464,1477,1478],{"class":466,"line":739},[464,1479,743],{"emptyLinePlaceholder":742},[464,1481,1482,1484,1486,1488],{"class":466,"line":746},[464,1483,769],{"class":474},[464,1485,648],{"class":641},[464,1487,1076],{"class":980},[464,1489,1490],{"class":774},"               # dtype('int16')   — borrowed, not one sample widened\n",[464,1492,1493,1495,1497,1499],{"class":466,"line":951},[464,1494,769],{"class":474},[464,1496,648],{"class":641},[464,1498,1224],{"class":980},[464,1500,1501],{"class":774},"    # dtype('float32') — 0.7 mm is not an int16\n",[450,1503,1504,1505,1508],{},"The samples stay int16 while the grid is floating, so the spacing survives and the field costs what the measurement costs: a 512³ scan holds 256 MB of samples, not the 512 MB a float32 field would. A byte-swapped array of an accepted dtype is byteswapped into its own row rather than widened, so NIfTI's big-endian ",[461,1506,1507],{},">i2"," stays an int16 field.",[450,1510,1511,1512,1515,1516,1518,1519,1522,1523,1526,1527,1518,1529,1532],{},"int16, uint16 and uint8 are accepted wherever a field is ",[1385,1513,1514],{},"consumed",": ",[461,1517,763],{}," and ",[461,1520,1521],{},"volume_slice_contours",". A field ",[1385,1524,1525],{},"generator"," emits what it computes, so ",[461,1528,652],{},[461,1530,1531],{},"mesh_sdf"," stay real-valued.",[1357,1534,1536],{"id":1535},"the-dtype-argument","The dtype Argument",[450,1538,1539,1540,1542],{},"Every entry takes a ",[461,1541,1076],{}," argument for the field or the geometry it emits; only float32 and float64 are accepted. Unstated, each entry falls back to its own input:",[496,1544,1545,1557],{},[499,1546,1547],{},[502,1548,1549,1552],{},[505,1550,1551],{},"Entry",[505,1553,1554,1555],{},"Unstated ",[461,1556,1076],{},[515,1558,1559,1572,1584,1600,1613],{},[502,1560,1561,1567],{},[520,1562,1563,1404,1565],{},[461,1564,763],{},[461,1566,1521],{},[520,1568,1569,1570],{},"the volume's ",[461,1571,1224],{},[502,1573,1574,1579],{},[520,1575,1576],{},[461,1577,1578],{},"volume_boolean",[520,1580,1581,1582],{},"A's ",[461,1583,1224],{},[502,1585,1586,1591],{},[520,1587,1588],{},[461,1589,1590],{},"resampled_volume",[520,1592,1569,1593,1596,1597,1599],{},[1385,1594,1595],{},"sample"," ",[461,1598,1076],{}," (it accepts float fields only, where the two coincide)",[502,1601,1602,1606],{},[520,1603,1604],{},[461,1605,1531],{},[520,1607,1608,1609,1612],{},"the ",[1385,1610,1611],{},"mesh's"," dtype — the call takes no volume",[502,1614,1615,1619],{},[520,1616,1617],{},[461,1618,652],{},[520,1620,1621],{},"float32 — it builds a field out of numbers, so there is nothing to read a type from",[454,1623,1625],{"className":456,"code":1624,"language":458,"meta":459,"style":459},"faces, points = tf.isosurface(vol)                      # float32 samples -> float32 points\nfaces, points = tf.isosurface(vol, dtype=np.float64)    # float64 points\nfaces, points = tf.isosurface(ct_volume, 300.0)         # int16 samples -> float32 points\n",[461,1626,1627,1652,1691],{"__ignoreMap":459},[464,1628,1629,1631,1633,1635,1637,1639,1641,1643,1645,1647,1649],{"class":466,"line":467},[464,1630,749],{"class":474},[464,1632,662],{"class":641},[464,1634,754],{"class":474},[464,1636,642],{"class":641},[464,1638,645],{"class":474},[464,1640,648],{"class":641},[464,1642,763],{"class":651},[464,1644,766],{"class":641},[464,1646,769],{"class":651},[464,1648,628],{"class":641},[464,1650,1651],{"class":774},"                      # float32 samples -> float32 points\n",[464,1653,1654,1656,1658,1660,1662,1664,1666,1668,1670,1672,1674,1677,1679,1681,1683,1686,1688],{"class":466,"line":484},[464,1655,749],{"class":474},[464,1657,662],{"class":641},[464,1659,754],{"class":474},[464,1661,642],{"class":641},[464,1663,645],{"class":474},[464,1665,648],{"class":641},[464,1667,763],{"class":651},[464,1669,766],{"class":641},[464,1671,769],{"class":651},[464,1673,662],{"class":641},[464,1675,1676],{"class":861}," dtype",[464,1678,642],{"class":641},[464,1680,820],{"class":651},[464,1682,648],{"class":641},[464,1684,1685],{"class":980},"float64",[464,1687,628],{"class":641},[464,1689,1690],{"class":774},"    # float64 points\n",[464,1692,1693,1695,1697,1699,1701,1703,1705,1707,1709,1712,1714,1717,1719],{"class":466,"line":739},[464,1694,749],{"class":474},[464,1696,662],{"class":641},[464,1698,754],{"class":474},[464,1700,642],{"class":641},[464,1702,645],{"class":474},[464,1704,648],{"class":641},[464,1706,763],{"class":651},[464,1708,766],{"class":641},[464,1710,1711],{"class":651},"ct_volume",[464,1713,662],{"class":641},[464,1715,1716],{"class":658}," 300.0",[464,1718,628],{"class":641},[464,1720,1721],{"class":774},"         # int16 samples -> float32 points\n",[450,1723,1724,1725,1727,1728,1731],{},"A ",[461,1726,1224],{}," is float32 for an integer-sampled field, which is why the int16 scan above emits float32 points. Each sample is read through one cast into the emitted type, so a crossing always lands on the edge it belongs to. An isovalue is a field value ",[1385,1729,1730],{},"in that type",", not in the sample type, so a fractional threshold on an integer field is exactly expressible.",[1357,1733,1228],{"id":1734},"transformations",[450,1736,1724,1737,1739,1740,1743,1744,1746,1747,648],{},[461,1738,101],{}," mirrors ",[461,1741,1742],{},"Mesh",": an optional 4x4 world pose in ",[461,1745,1210],{},", in the volume's ",[461,1748,1224],{},[454,1750,1752],{"className":456,"code":1751,"language":458,"meta":459,"style":459},"vol.transformation = pose_4x4          # posed\nfaces, points = tf.isosurface(vol)     # world-space triangles\nvol.transformation = None              # unposed again\n",[461,1753,1754,1770,1795],{"__ignoreMap":459},[464,1755,1756,1758,1760,1762,1764,1767],{"class":466,"line":467},[464,1757,769],{"class":474},[464,1759,648],{"class":641},[464,1761,1210],{"class":980},[464,1763,1124],{"class":641},[464,1765,1766],{"class":474}," pose_4x4          ",[464,1768,1769],{"class":774},"# posed\n",[464,1771,1772,1774,1776,1778,1780,1782,1784,1786,1788,1790,1792],{"class":466,"line":484},[464,1773,749],{"class":474},[464,1775,662],{"class":641},[464,1777,754],{"class":474},[464,1779,642],{"class":641},[464,1781,645],{"class":474},[464,1783,648],{"class":641},[464,1785,763],{"class":651},[464,1787,766],{"class":641},[464,1789,769],{"class":651},[464,1791,628],{"class":641},[464,1793,1794],{"class":774},"     # world-space triangles\n",[464,1796,1797,1799,1801,1803,1805,1808],{"class":466,"line":739},[464,1798,769],{"class":474},[464,1800,648],{"class":641},[464,1802,1210],{"class":980},[464,1804,1124],{"class":641},[464,1806,1807],{"class":641}," None",[464,1809,1810],{"class":774},"              # unposed again\n",[450,1812,1813,1814,1817,1818,1518,1820,1822,1823,1825,1826,1830,1831,1833,1834,1836,1837,648],{},"The grid stays axis-aligned in its own local space. Positional ",[1385,1815,1816],{},"inputs"," — a slice plane's origin and axes, an unposed volume's resample target grid — stay local. ",[461,1819,763],{},[461,1821,1521],{}," emit world-space geometry, ",[461,1824,1590],{}," resamples ",[1827,1828,1829],"em",{},"through"," the pose onto a world-space target grid, and ",[461,1832,1578],{}," combines on one shared grid. Setting the identity is the same statement as setting ",[461,1835,1232],{},", so an identity pose reads back as ",[461,1838,1232],{},[783,1840,1842],{"id":1841},"signed-distance-fields","Signed Distance Fields",[450,1844,1845],{},"A signed distance field is negative inside the solid, positive outside, and zero on its surface; extracting the isosurface at 0 recovers the shape.",[1357,1847,652],{"id":652},[454,1849,1851],{"className":456,"code":1850,"language":458,"meta":459,"style":459},"ball = tf.sphere_sdf((64, 64, 64), (0.1, 0.1, 0.1), (-3.2, -3.2, -3.2),\n                     (0.0, 0.0, 0.0), 1.5)\n",[461,1852,1853,1912],{"__ignoreMap":459},[464,1854,1855,1858,1860,1862,1864,1866,1868,1870,1872,1874,1876,1878,1880,1882,1884,1886,1888,1890,1892,1894,1896,1898,1900,1902,1904,1906,1908,1910],{"class":466,"line":467},[464,1856,1857],{"class":474},"ball ",[464,1859,642],{"class":641},[464,1861,645],{"class":474},[464,1863,648],{"class":641},[464,1865,652],{"class":651},[464,1867,655],{"class":641},[464,1869,659],{"class":658},[464,1871,662],{"class":641},[464,1873,665],{"class":658},[464,1875,662],{"class":641},[464,1877,665],{"class":658},[464,1879,672],{"class":641},[464,1881,675],{"class":641},[464,1883,678],{"class":658},[464,1885,662],{"class":641},[464,1887,683],{"class":658},[464,1889,662],{"class":641},[464,1891,683],{"class":658},[464,1893,672],{"class":641},[464,1895,692],{"class":641},[464,1897,695],{"class":658},[464,1899,662],{"class":641},[464,1901,700],{"class":641},[464,1903,695],{"class":658},[464,1905,662],{"class":641},[464,1907,700],{"class":641},[464,1909,695],{"class":658},[464,1911,711],{"class":641},[464,1913,1914,1917,1919,1921,1923,1925,1927,1929,1931],{"class":466,"line":484},[464,1915,1916],{"class":641},"                     (",[464,1918,719],{"class":658},[464,1920,662],{"class":641},[464,1922,724],{"class":658},[464,1924,662],{"class":641},[464,1926,724],{"class":658},[464,1928,672],{"class":641},[464,1930,733],{"class":658},[464,1932,736],{"class":641},[496,1934,1935,1946],{},[499,1936,1937],{},[502,1938,1939,1941,1944],{},[505,1940,1141],{},[505,1942,1943],{},"Default",[505,1945,1147],{},[515,1947,1948,1960,1971,1983,1995,2007],{},[502,1949,1950,1954,1957],{},[520,1951,1952],{},[461,1953,1037],{},[520,1955,1956],{},"—",[520,1958,1959],{},"Number of samples along x, y, z",[502,1961,1962,1966,1968],{},[520,1963,1964],{},[461,1965,1050],{},[520,1967,1956],{},[520,1969,1970],{},"Physical size of one voxel step along x, y, z",[502,1972,1973,1977,1979],{},[520,1974,1975],{},[461,1976,1063],{},[520,1978,1956],{},[520,1980,1197,1981],{},[461,1982,1200],{},[502,1984,1985,1990,1992],{},[520,1986,1987],{},[461,1988,1989],{},"center",[520,1991,1956],{},[520,1993,1994],{},"Sphere centre, in the volume's local frame",[502,1996,1997,2002,2004],{},[520,1998,1999],{},[461,2000,2001],{},"radius",[520,2003,1956],{},[520,2005,2006],{},"Sphere radius",[502,2008,2009,2013,2018],{},[520,2010,2011],{},[461,2012,1076],{},[520,2014,2015],{},[461,2016,2017],{},"np.float32",[520,2019,2020],{},"The sample type of the field, float32 or float64",[450,2022,2023,2024,648],{},"Each sample holds ",[461,2025,2026],{},"distance(point, center) - radius",[1357,2028,1531],{"id":1531},[454,2030,2032],{"className":456,"code":2031,"language":458,"meta":459,"style":459},"faces, points = tf.make_sphere_mesh(1.0)\nfield = tf.mesh_sdf((faces, points), (64, 64, 64), (0.1, 0.1, 0.1),\n                    (-3.2, -3.2, -3.2))\n\n# a Mesh works the same way\nfield = tf.mesh_sdf(tf.Mesh(faces, points), (64, 64, 64), (0.1, 0.1, 0.1),\n                    (-3.2, -3.2, -3.2))\n",[461,2033,2034,2058,2110,2131,2135,2140,2199],{"__ignoreMap":459},[464,2035,2036,2038,2040,2042,2044,2046,2048,2051,2053,2056],{"class":466,"line":467},[464,2037,749],{"class":474},[464,2039,662],{"class":641},[464,2041,754],{"class":474},[464,2043,642],{"class":641},[464,2045,645],{"class":474},[464,2047,648],{"class":641},[464,2049,2050],{"class":651},"make_sphere_mesh",[464,2052,766],{"class":641},[464,2054,2055],{"class":658},"1.0",[464,2057,736],{"class":641},[464,2059,2060,2063,2065,2067,2069,2071,2073,2075,2077,2080,2082,2084,2086,2088,2090,2092,2094,2096,2098,2100,2102,2104,2106,2108],{"class":466,"line":484},[464,2061,2062],{"class":474},"field ",[464,2064,642],{"class":641},[464,2066,645],{"class":474},[464,2068,648],{"class":641},[464,2070,1531],{"class":651},[464,2072,655],{"class":641},[464,2074,749],{"class":651},[464,2076,662],{"class":641},[464,2078,2079],{"class":651}," points",[464,2081,672],{"class":641},[464,2083,675],{"class":641},[464,2085,659],{"class":658},[464,2087,662],{"class":641},[464,2089,665],{"class":658},[464,2091,662],{"class":641},[464,2093,665],{"class":658},[464,2095,672],{"class":641},[464,2097,675],{"class":641},[464,2099,678],{"class":658},[464,2101,662],{"class":641},[464,2103,683],{"class":658},[464,2105,662],{"class":641},[464,2107,683],{"class":658},[464,2109,711],{"class":641},[464,2111,2112,2115,2117,2119,2121,2123,2125,2127,2129],{"class":466,"line":739},[464,2113,2114],{"class":641},"                    (-",[464,2116,695],{"class":658},[464,2118,662],{"class":641},[464,2120,700],{"class":641},[464,2122,695],{"class":658},[464,2124,662],{"class":641},[464,2126,700],{"class":641},[464,2128,695],{"class":658},[464,2130,1027],{"class":641},[464,2132,2133],{"class":466,"line":746},[464,2134,743],{"emptyLinePlaceholder":742},[464,2136,2137],{"class":466,"line":951},[464,2138,2139],{"class":774},"# a Mesh works the same way\n",[464,2141,2142,2144,2146,2148,2150,2152,2154,2157,2159,2161,2163,2165,2167,2169,2171,2173,2175,2177,2179,2181,2183,2185,2187,2189,2191,2193,2195,2197],{"class":466,"line":1004},[464,2143,2062],{"class":474},[464,2145,642],{"class":641},[464,2147,645],{"class":474},[464,2149,648],{"class":641},[464,2151,1531],{"class":651},[464,2153,766],{"class":641},[464,2155,2156],{"class":651},"tf",[464,2158,648],{"class":641},[464,2160,1742],{"class":651},[464,2162,766],{"class":641},[464,2164,749],{"class":651},[464,2166,662],{"class":641},[464,2168,2079],{"class":651},[464,2170,672],{"class":641},[464,2172,675],{"class":641},[464,2174,659],{"class":658},[464,2176,662],{"class":641},[464,2178,665],{"class":658},[464,2180,662],{"class":641},[464,2182,665],{"class":658},[464,2184,672],{"class":641},[464,2186,675],{"class":641},[464,2188,678],{"class":658},[464,2190,662],{"class":641},[464,2192,683],{"class":658},[464,2194,662],{"class":641},[464,2196,683],{"class":658},[464,2198,711],{"class":641},[464,2200,2201,2203,2205,2207,2209,2211,2213,2215,2217],{"class":466,"line":1030},[464,2202,2114],{"class":641},[464,2204,695],{"class":658},[464,2206,662],{"class":641},[464,2208,700],{"class":641},[464,2210,695],{"class":658},[464,2212,662],{"class":641},[464,2214,700],{"class":641},[464,2216,695],{"class":658},[464,2218,1027],{"class":641},[496,2220,2221,2231],{},[499,2222,2223],{},[502,2224,2225,2227,2229],{},[505,2226,1141],{},[505,2228,1943],{},[505,2230,1147],{},[515,2232,2233,2253,2263,2273,2289,2300,2321],{},[502,2234,2235,2240,2242],{},[520,2236,2237],{},[461,2238,2239],{},"data",[520,2241,1956],{},[520,2243,1724,2244,2249,2250,2252],{},[626,2245,2247],{"href":2246},"\u002Fpy\u002Fmodules\u002Fspatial#mesh",[461,2248,1742],{}," or a ",[461,2251,571],{}," tuple",[502,2254,2255,2259,2261],{},[520,2256,2257],{},[461,2258,1037],{},[520,2260,1956],{},[520,2262,1959],{},[502,2264,2265,2269,2271],{},[520,2266,2267],{},[461,2268,1050],{},[520,2270,1956],{},[520,2272,1970],{},[502,2274,2275,2279,2281],{},[520,2276,2277],{},[461,2278,1063],{},[520,2280,1956],{},[520,2282,2283,2284,2286,2287],{},"Position of sample ",[461,2285,1200],{},", in the mesh's own frame — world space when it carries a ",[461,2288,1210],{},[502,2290,2291,2295,2298],{},[520,2292,2293],{},[461,2294,1076],{},[520,2296,2297],{},"the mesh's own dtype",[520,2299,2020],{},[502,2301,2302,2307,2312],{},[520,2303,2304],{},[461,2305,2306],{},"mode",[520,2308,2309],{},[461,2310,2311],{},"\"exact\"",[520,2313,2314,2316,2317,2320],{},[461,2315,2311],{}," measures every sample; ",[461,2318,2319],{},"\"banded\""," measures a band and sweeps the rest",[502,2322,2323,2328,2332],{},[520,2324,2325],{},[461,2326,2327],{},"band",[520,2329,2330],{},[461,2331,906],{},[520,2333,2334],{},"Banded only: voxels of exactly measured magnitude on each side of the surface",[450,2336,2337],{},"Each sample takes the distance to the nearest point of the surface, signed by exact crossing parity: negative inside by winding, so an inverted shell inverts its field and nested shells stay solid inside.",[2339,2340,2342],"warning",{"icon":2341},"i-lucide-alert-triangle",[450,2343,2344,2345,2351],{},"The mesh must be closed — an open mesh has no inside, and the parity sign is undefined on one. Repair an open mesh with ",[626,2346,2348],{"href":2347},"\u002Fpy\u002Fmodules\u002Fcsg#outer-shell",[461,2349,2350],{},"tf.outer_shell"," first.",[450,2353,2354,2355,2357,2358,2360,2361,2363,2364,2363,2366,2368],{},"The spatial tree the measurement needs is built and cached on the mesh for you; pass a ",[461,2356,1742],{}," (rather than a tuple) when you call more than once, so the tree is paid for once. The grid samples the mesh in world space when the mesh carries a ",[461,2359,1210],{}," and in its local frame otherwise, so build ",[461,2362,1037],{},"\u002F",[461,2365,1050],{},[461,2367,1063],{}," from the mesh's bounds in that same space.",[454,2370,2372],{"className":456,"code":2371,"language":458,"meta":459,"style":459},"mesh = tf.Mesh(faces, points)\nmesh.build_tree()                       # optional: pay for it when you choose\nnear = tf.mesh_sdf(mesh, (64, 64, 64), (0.1, 0.1, 0.1), (-3.2, -3.2, -3.2))\nfast = tf.mesh_sdf(mesh, (64, 64, 64), (0.1, 0.1, 0.1), (-3.2, -3.2, -3.2),\n                   mode=\"banded\", band=4)\n",[461,2373,2374,2397,2413,2478,2543],{"__ignoreMap":459},[464,2375,2376,2379,2381,2383,2385,2387,2389,2391,2393,2395],{"class":466,"line":467},[464,2377,2378],{"class":474},"mesh ",[464,2380,642],{"class":641},[464,2382,645],{"class":474},[464,2384,648],{"class":641},[464,2386,1742],{"class":651},[464,2388,766],{"class":641},[464,2390,749],{"class":651},[464,2392,662],{"class":641},[464,2394,2079],{"class":651},[464,2396,736],{"class":641},[464,2398,2399,2402,2404,2407,2410],{"class":466,"line":484},[464,2400,2401],{"class":474},"mesh",[464,2403,648],{"class":641},[464,2405,2406],{"class":651},"build_tree",[464,2408,2409],{"class":641},"()",[464,2411,2412],{"class":774},"                       # optional: pay for it when you choose\n",[464,2414,2415,2418,2420,2422,2424,2426,2428,2430,2432,2434,2436,2438,2440,2442,2444,2446,2448,2450,2452,2454,2456,2458,2460,2462,2464,2466,2468,2470,2472,2474,2476],{"class":466,"line":739},[464,2416,2417],{"class":474},"near ",[464,2419,642],{"class":641},[464,2421,645],{"class":474},[464,2423,648],{"class":641},[464,2425,1531],{"class":651},[464,2427,766],{"class":641},[464,2429,2401],{"class":651},[464,2431,662],{"class":641},[464,2433,675],{"class":641},[464,2435,659],{"class":658},[464,2437,662],{"class":641},[464,2439,665],{"class":658},[464,2441,662],{"class":641},[464,2443,665],{"class":658},[464,2445,672],{"class":641},[464,2447,675],{"class":641},[464,2449,678],{"class":658},[464,2451,662],{"class":641},[464,2453,683],{"class":658},[464,2455,662],{"class":641},[464,2457,683],{"class":658},[464,2459,672],{"class":641},[464,2461,692],{"class":641},[464,2463,695],{"class":658},[464,2465,662],{"class":641},[464,2467,700],{"class":641},[464,2469,695],{"class":658},[464,2471,662],{"class":641},[464,2473,700],{"class":641},[464,2475,695],{"class":658},[464,2477,1027],{"class":641},[464,2479,2480,2483,2485,2487,2489,2491,2493,2495,2497,2499,2501,2503,2505,2507,2509,2511,2513,2515,2517,2519,2521,2523,2525,2527,2529,2531,2533,2535,2537,2539,2541],{"class":466,"line":746},[464,2481,2482],{"class":474},"fast ",[464,2484,642],{"class":641},[464,2486,645],{"class":474},[464,2488,648],{"class":641},[464,2490,1531],{"class":651},[464,2492,766],{"class":641},[464,2494,2401],{"class":651},[464,2496,662],{"class":641},[464,2498,675],{"class":641},[464,2500,659],{"class":658},[464,2502,662],{"class":641},[464,2504,665],{"class":658},[464,2506,662],{"class":641},[464,2508,665],{"class":658},[464,2510,672],{"class":641},[464,2512,675],{"class":641},[464,2514,678],{"class":658},[464,2516,662],{"class":641},[464,2518,683],{"class":658},[464,2520,662],{"class":641},[464,2522,683],{"class":658},[464,2524,672],{"class":641},[464,2526,692],{"class":641},[464,2528,695],{"class":658},[464,2530,662],{"class":641},[464,2532,700],{"class":641},[464,2534,695],{"class":658},[464,2536,662],{"class":641},[464,2538,700],{"class":641},[464,2540,695],{"class":658},[464,2542,711],{"class":641},[464,2544,2545,2548,2550,2552,2555,2557,2559,2562,2564,2567],{"class":466,"line":951},[464,2546,2547],{"class":861},"                   mode",[464,2549,642],{"class":641},[464,2551,867],{"class":641},[464,2553,2554],{"class":870},"banded",[464,2556,867],{"class":641},[464,2558,662],{"class":641},[464,2560,2561],{"class":861}," band",[464,2563,642],{"class":641},[464,2565,2566],{"class":658},"4",[464,2568,736],{"class":641},[450,2570,2571,2574,2575,2577],{},[461,2572,2573],{},"mode=\"banded\""," measures only the samples within ",[461,2576,2327],{}," voxels of the surface and propagates the far field with a seeded distance sweep — an order of magnitude faster. The sign is exact everywhere and the magnitude is exact inside the band. Beyond it, on grids whose lines resolve the surface, the 99th percentile of the error is under about one voxel and shrinks with resolution; the deep interior near the medial axis may locally undershoot by a few voxels. A feature no grid line meets is not found when the band is measured, so its neighbourhood takes the swept far field's value instead.",[783,2579,2581],{"id":2580},"isosurface-extraction","Isosurface Extraction",[1357,2583,763],{"id":763},[454,2585,2587],{"className":456,"code":2586,"language":458,"meta":459,"style":459},"faces, points = tf.isosurface(vol)                          # the zero level set\nfaces, points = tf.isosurface(vol, 0.25)                    # an offset surface\nfaces, points = tf.isosurface(vol, method=\"dual_contouring\")\n",[461,2588,2589,2614,2644],{"__ignoreMap":459},[464,2590,2591,2593,2595,2597,2599,2601,2603,2605,2607,2609,2611],{"class":466,"line":467},[464,2592,749],{"class":474},[464,2594,662],{"class":641},[464,2596,754],{"class":474},[464,2598,642],{"class":641},[464,2600,645],{"class":474},[464,2602,648],{"class":641},[464,2604,763],{"class":651},[464,2606,766],{"class":641},[464,2608,769],{"class":651},[464,2610,628],{"class":641},[464,2612,2613],{"class":774},"                          # the zero level set\n",[464,2615,2616,2618,2620,2622,2624,2626,2628,2630,2632,2634,2636,2639,2641],{"class":466,"line":484},[464,2617,749],{"class":474},[464,2619,662],{"class":641},[464,2621,754],{"class":474},[464,2623,642],{"class":641},[464,2625,645],{"class":474},[464,2627,648],{"class":641},[464,2629,763],{"class":651},[464,2631,766],{"class":641},[464,2633,769],{"class":651},[464,2635,662],{"class":641},[464,2637,2638],{"class":658}," 0.25",[464,2640,628],{"class":641},[464,2642,2643],{"class":774},"                    # an offset surface\n",[464,2645,2646,2648,2650,2652,2654,2656,2658,2660,2662,2664,2666,2669,2671,2673,2676,2678],{"class":466,"line":739},[464,2647,749],{"class":474},[464,2649,662],{"class":641},[464,2651,754],{"class":474},[464,2653,642],{"class":641},[464,2655,645],{"class":474},[464,2657,648],{"class":641},[464,2659,763],{"class":651},[464,2661,766],{"class":641},[464,2663,769],{"class":651},[464,2665,662],{"class":641},[464,2667,2668],{"class":861}," method",[464,2670,642],{"class":641},[464,2672,867],{"class":641},[464,2674,2675],{"class":870},"dual_contouring",[464,2677,867],{"class":641},[464,2679,736],{"class":641},[496,2681,2682,2692],{},[499,2683,2684],{},[502,2685,2686,2688,2690],{},[505,2687,1141],{},[505,2689,1943],{},[505,2691,1147],{},[515,2693,2694,2705,2719,2740,2755,2770],{},[502,2695,2696,2700,2702],{},[520,2697,2698],{},[461,2699,785],{},[520,2701,1956],{},[520,2703,2704],{},"The scalar volume",[502,2706,2707,2712,2716],{},[520,2708,2709],{},[461,2710,2711],{},"iso",[520,2713,2714],{},[461,2715,719],{},[520,2717,2718],{},"The isovalue to extract",[502,2720,2721,2726,2731],{},[520,2722,2723],{},[461,2724,2725],{},"method",[520,2727,2728],{},[461,2729,2730],{},"\"flying_edges\"",[520,2732,2733,2735,2736,2739],{},[461,2734,2730],{}," places every vertex on a grid edge — the fastest regular output, defined for any field. ",[461,2737,2738],{},"\"dual_contouring\""," places one vertex per surface component of a cell, fitted to the field's own crossings, so creases and corners survive; it assumes a distance-like field",[502,2741,2742,2747,2752],{},[520,2743,2744],{},[461,2745,2746],{},"refine",[520,2748,2749],{},[461,2750,2751],{},"True",[520,2753,2754],{},"Dual contouring only: refit each feature vertex to the planes its neighbourhood's crossings state",[502,2756,2757,2762,2767],{},[520,2758,2759],{},[461,2760,2761],{},"stabilizer",[520,2763,2764],{},[461,2765,2766],{},"0.01",[520,2768,2769],{},"Dual contouring only: the dimensionless pull toward the crossing centroid. Must be finite and nonnegative",[502,2771,2772,2776,2781],{},[520,2773,2774],{},[461,2775,1076],{},[520,2777,2778,2779],{},"volume's ",[461,2780,1224],{},[520,2782,2783],{},"The coordinate type of the emitted points",[450,2785,2786,2788,2789,2792,2793,1596,2796,2799,2800,2802,2803,2806,2807,2810,2811,1404,2814,2817],{},[461,2787,749],{}," comes back ",[461,2790,2791],{},"(N, 3)"," dtype int32 and ",[461,2794,2795],{},"points",[461,2797,2798],{},"(M, 3)"," in the requested dtype — a welded, indexed triangle mesh in the volume's own frame, or world space when it carries a ",[461,2801,1210],{},". A corner is inside when ",[461,2804,2805],{},"sample \u003C iso",", so a signed distance field (negative inside) yields outward windings. For an SDF a nonzero isovalue is an offset surface: ",[461,2808,2809],{},"+d"," inflates by ",[461,2812,2813],{},"d",[461,2815,2816],{},"-d"," deflates by it.",[450,2819,2820],{},"Dual contouring's output is manifold by construction. Reach for it on an SDF of a machined or faceted shape, where flying edges rounds every crease off to the grid:",[454,2822,2824],{"className":456,"code":2823,"language":458,"meta":459,"style":459},"faces, points = tf.isosurface(vol, method=\"dual_contouring\")\nmesh = tf.Mesh(faces, points)\ntf.is_closed(mesh), tf.is_manifold(mesh)      # (True, True)\n",[461,2825,2826,2860,2882],{"__ignoreMap":459},[464,2827,2828,2830,2832,2834,2836,2838,2840,2842,2844,2846,2848,2850,2852,2854,2856,2858],{"class":466,"line":467},[464,2829,749],{"class":474},[464,2831,662],{"class":641},[464,2833,754],{"class":474},[464,2835,642],{"class":641},[464,2837,645],{"class":474},[464,2839,648],{"class":641},[464,2841,763],{"class":651},[464,2843,766],{"class":641},[464,2845,769],{"class":651},[464,2847,662],{"class":641},[464,2849,2668],{"class":861},[464,2851,642],{"class":641},[464,2853,867],{"class":641},[464,2855,2675],{"class":870},[464,2857,867],{"class":641},[464,2859,736],{"class":641},[464,2861,2862,2864,2866,2868,2870,2872,2874,2876,2878,2880],{"class":466,"line":484},[464,2863,2378],{"class":474},[464,2865,642],{"class":641},[464,2867,645],{"class":474},[464,2869,648],{"class":641},[464,2871,1742],{"class":651},[464,2873,766],{"class":641},[464,2875,749],{"class":651},[464,2877,662],{"class":641},[464,2879,2079],{"class":651},[464,2881,736],{"class":641},[464,2883,2884,2886,2888,2891,2893,2895,2897,2899,2901,2904,2906,2908,2910],{"class":466,"line":739},[464,2885,2156],{"class":474},[464,2887,648],{"class":641},[464,2889,2890],{"class":651},"is_closed",[464,2892,766],{"class":641},[464,2894,2401],{"class":651},[464,2896,672],{"class":641},[464,2898,645],{"class":474},[464,2900,648],{"class":641},[464,2902,2903],{"class":651},"is_manifold",[464,2905,766],{"class":641},[464,2907,2401],{"class":651},[464,2909,628],{"class":641},[464,2911,2912],{"class":774},"      # (True, True)\n",[783,2914,2916],{"id":2915},"boolean-csg-of-fields","Boolean CSG of Fields",[1357,2918,1578],{"id":1578},[454,2920,2922],{"className":456,"code":2921,"language":458,"meta":459,"style":459},"merged = tf.volume_boolean(a, b, \"union\")\ncarved = tf.volume_boolean(a, b, \"difference\")\nfaces, points = tf.isosurface(carved)\n",[461,2923,2924,2958,2990],{"__ignoreMap":459},[464,2925,2926,2929,2931,2933,2935,2937,2939,2941,2943,2946,2948,2951,2954,2956],{"class":466,"line":467},[464,2927,2928],{"class":474},"merged ",[464,2930,642],{"class":641},[464,2932,645],{"class":474},[464,2934,648],{"class":641},[464,2936,1578],{"class":651},[464,2938,766],{"class":641},[464,2940,626],{"class":651},[464,2942,662],{"class":641},[464,2944,2945],{"class":651}," b",[464,2947,662],{"class":641},[464,2949,2950],{"class":641}," \"",[464,2952,2953],{"class":870},"union",[464,2955,867],{"class":641},[464,2957,736],{"class":641},[464,2959,2960,2963,2965,2967,2969,2971,2973,2975,2977,2979,2981,2983,2986,2988],{"class":466,"line":484},[464,2961,2962],{"class":474},"carved ",[464,2964,642],{"class":641},[464,2966,645],{"class":474},[464,2968,648],{"class":641},[464,2970,1578],{"class":651},[464,2972,766],{"class":641},[464,2974,626],{"class":651},[464,2976,662],{"class":641},[464,2978,2945],{"class":651},[464,2980,662],{"class":641},[464,2982,2950],{"class":641},[464,2984,2985],{"class":870},"difference",[464,2987,867],{"class":641},[464,2989,736],{"class":641},[464,2991,2992,2994,2996,2998,3000,3002,3004,3006,3008,3011],{"class":466,"line":739},[464,2993,749],{"class":474},[464,2995,662],{"class":641},[464,2997,754],{"class":474},[464,2999,642],{"class":641},[464,3001,645],{"class":474},[464,3003,648],{"class":641},[464,3005,763],{"class":651},[464,3007,766],{"class":641},[464,3009,3010],{"class":651},"carved",[464,3012,736],{"class":641},[496,3014,3015,3028],{},[499,3016,3017],{},[502,3018,3019,3022,3025],{},[505,3020,3021],{},"Operation",[505,3023,3024],{},"Combinator",[505,3026,3027],{},"Meaning",[515,3029,3030,3045,3060],{},[502,3031,3032,3037,3042],{},[520,3033,3034],{},[461,3035,3036],{},"\"union\"",[520,3038,3039],{},[461,3040,3041],{},"min(a, b)",[520,3043,3044],{},"A ∪ B — inside either field",[502,3046,3047,3052,3057],{},[520,3048,3049],{},[461,3050,3051],{},"\"intersection\"",[520,3053,3054],{},[461,3055,3056],{},"max(a, b)",[520,3058,3059],{},"A ∩ B — inside both",[502,3061,3062,3067,3072],{},[520,3063,3064],{},[461,3065,3066],{},"\"difference\"",[520,3068,3069],{},[461,3070,3071],{},"max(a, -b)",[520,3073,3074],{},"A \\ B — inside A, outside B",[496,3076,3077,3087],{},[499,3078,3079],{},[502,3080,3081,3083,3085],{},[505,3082,1141],{},[505,3084,1943],{},[505,3086,1147],{},[515,3088,3089,3103,3117],{},[502,3090,3091,3098,3100],{},[520,3092,3093,1404,3095],{},[461,3094,626],{},[461,3096,3097],{},"b",[520,3099,1956],{},[520,3101,3102],{},"The two fields. Their sample dtypes must match",[502,3104,3105,3110,3114],{},[520,3106,3107],{},[461,3108,3109],{},"operation",[520,3111,3112],{},[461,3113,3036],{},[520,3115,3116],{},"One of the three above",[502,3118,3119,3123,3127],{},[520,3120,3121],{},[461,3122,1076],{},[520,3124,1581,3125],{},[461,3126,1224],{},[520,3128,3129],{},"The sample type of the combined field",[450,3131,3132],{},"The combinators are exact on the zero level set, so the extracted isosurface is exactly the boolean of the two solids.",[450,3134,3135,3136,3139,3140,3143,3144,3147],{},"The two fields need not share a grid or a pose. Matching grids ",[1385,3137,3138],{},"and"," matching ",[626,3141,3142],{"href":1227},"poses"," combine sample-wise and the result keeps that shared pose; anything else resamples both operands multilinearly onto a common world-axis-aligned grid spanning the union of their world domains at the finer of the two local spacings, and the result comes back unposed. Out of an operand's domain is ",[1385,3145,3146],{},"outside its solid"," — each operand reads a far-outside sentinel past its own box — so a solid that reaches its own domain boundary stops there rather than continuing across the shared grid.",[450,3149,3150,3151,1515,3154,3156,3157,3160,3161,3163],{},"An SDF has a negative inside, so an ",[1385,3152,3153],{},"unsigned field is not one",[461,3155,1578],{}," raises ",[461,3158,3159],{},"TypeError"," for uint16 and uint8 operands, naming the accepted dtypes. int16 operands are accepted; the combine is computed in a floating type, so the result carries the requested ",[461,3162,1076],{}," rather than int16 samples.",[3165,3166,3168],"h4",{"id":3167},"masks","Masks",[450,3170,3171,3172,3174,3175,3178,3179,3182],{},"A label map or segmentation mask is a uint8 field whose foreground is a positive constant, which is the opposite of the SDF convention — a corner is inside when ",[461,3173,2805],{},". Thresholding a ",[461,3176,3177],{},"0\u002F255"," mask at its midpoint therefore extracts the correct surface but winds it ",[1385,3180,3181],{},"into"," the foreground. Negate the mask into a signed field to get the mask's own inside and outward windings, and to make it a legal boolean operand:",[454,3184,3186],{"className":456,"code":3185,"language":458,"meta":459,"style":459},"faces, points = tf.isosurface(tf.Volume(mask), 127.5)     # surface, inward winding\n\nsigned = np.asfortranarray(127.5 - mask.astype(np.float32))\nfaces, points = tf.isosurface(tf.Volume(signed), 0.0)     # outward winding\ncarved = tf.volume_boolean(tf.Volume(signed), other, \"difference\")\n",[461,3187,3188,3227,3231,3268,3306],{"__ignoreMap":459},[464,3189,3190,3192,3194,3196,3198,3200,3202,3204,3206,3208,3210,3212,3214,3217,3219,3222,3224],{"class":466,"line":467},[464,3191,749],{"class":474},[464,3193,662],{"class":641},[464,3195,754],{"class":474},[464,3197,642],{"class":641},[464,3199,645],{"class":474},[464,3201,648],{"class":641},[464,3203,763],{"class":651},[464,3205,766],{"class":641},[464,3207,2156],{"class":651},[464,3209,648],{"class":641},[464,3211,101],{"class":651},[464,3213,766],{"class":641},[464,3215,3216],{"class":651},"mask",[464,3218,672],{"class":641},[464,3220,3221],{"class":658}," 127.5",[464,3223,628],{"class":641},[464,3225,3226],{"class":774},"     # surface, inward winding\n",[464,3228,3229],{"class":466,"line":484},[464,3230,743],{"emptyLinePlaceholder":742},[464,3232,3233,3236,3238,3240,3242,3244,3246,3249,3251,3254,3256,3258,3260,3262,3264,3266],{"class":466,"line":739},[464,3234,3235],{"class":474},"signed ",[464,3237,642],{"class":641},[464,3239,810],{"class":474},[464,3241,648],{"class":641},[464,3243,1263],{"class":651},[464,3245,766],{"class":641},[464,3247,3248],{"class":658},"127.5",[464,3250,700],{"class":641},[464,3252,3253],{"class":651}," mask",[464,3255,648],{"class":641},[464,3257,971],{"class":651},[464,3259,766],{"class":641},[464,3261,820],{"class":651},[464,3263,648],{"class":641},[464,3265,981],{"class":980},[464,3267,1027],{"class":641},[464,3269,3270,3272,3274,3276,3278,3280,3282,3284,3286,3288,3290,3292,3294,3297,3299,3301,3303],{"class":466,"line":746},[464,3271,749],{"class":474},[464,3273,662],{"class":641},[464,3275,754],{"class":474},[464,3277,642],{"class":641},[464,3279,645],{"class":474},[464,3281,648],{"class":641},[464,3283,763],{"class":651},[464,3285,766],{"class":641},[464,3287,2156],{"class":651},[464,3289,648],{"class":641},[464,3291,101],{"class":651},[464,3293,766],{"class":641},[464,3295,3296],{"class":651},"signed",[464,3298,672],{"class":641},[464,3300,724],{"class":658},[464,3302,628],{"class":641},[464,3304,3305],{"class":774},"     # outward winding\n",[464,3307,3308,3310,3312,3314,3316,3318,3320,3322,3324,3326,3328,3330,3332,3335,3337,3339,3341,3343],{"class":466,"line":951},[464,3309,2962],{"class":474},[464,3311,642],{"class":641},[464,3313,645],{"class":474},[464,3315,648],{"class":641},[464,3317,1578],{"class":651},[464,3319,766],{"class":641},[464,3321,2156],{"class":651},[464,3323,648],{"class":641},[464,3325,101],{"class":651},[464,3327,766],{"class":641},[464,3329,3296],{"class":651},[464,3331,672],{"class":641},[464,3333,3334],{"class":651}," other",[464,3336,662],{"class":641},[464,3338,2950],{"class":641},[464,3340,2985],{"class":870},[464,3342,867],{"class":641},[464,3344,736],{"class":641},[783,3346,3348],{"id":3347},"resampling","Resampling",[1357,3350,1590],{"id":1590},[454,3352,3354],{"className":456,"code":3353,"language":458,"meta":459,"style":459},"coarse = tf.resampled_volume(field, (32, 32, 32), (0.5, 0.5, 0.5), (0, 0, 0))\n",[461,3355,3356],{"__ignoreMap":459},[464,3357,3358,3361,3363,3365,3367,3369,3371,3374,3376,3378,3381,3383,3385,3387,3389,3391,3393,3395,3397,3400,3402,3404,3406,3408,3410,3412,3414,3416,3418],{"class":466,"line":467},[464,3359,3360],{"class":474},"coarse ",[464,3362,642],{"class":641},[464,3364,645],{"class":474},[464,3366,648],{"class":641},[464,3368,1590],{"class":651},[464,3370,766],{"class":641},[464,3372,3373],{"class":651},"field",[464,3375,662],{"class":641},[464,3377,675],{"class":641},[464,3379,3380],{"class":658},"32",[464,3382,662],{"class":641},[464,3384,900],{"class":658},[464,3386,662],{"class":641},[464,3388,900],{"class":658},[464,3390,672],{"class":641},[464,3392,675],{"class":641},[464,3394,1129],{"class":658},[464,3396,662],{"class":641},[464,3398,3399],{"class":658}," 0.5",[464,3401,662],{"class":641},[464,3403,3399],{"class":658},[464,3405,672],{"class":641},[464,3407,675],{"class":641},[464,3409,1316],{"class":658},[464,3411,662],{"class":641},[464,3413,1321],{"class":658},[464,3415,662],{"class":641},[464,3417,1321],{"class":658},[464,3419,1027],{"class":641},[496,3421,3422,3432],{},[499,3423,3424],{},[502,3425,3426,3428,3430],{},[505,3427,1141],{},[505,3429,1943],{},[505,3431,1147],{},[515,3433,3434,3447,3458,3469,3483],{},[502,3435,3436,3440,3442],{},[520,3437,3438],{},[461,3439,785],{},[520,3441,1956],{},[520,3443,3444,3445],{},"The source field. float32 or float64; integer-sampled fields raise ",[461,3446,3159],{},[502,3448,3449,3453,3455],{},[520,3450,3451],{},[461,3452,1037],{},[520,3454,1956],{},[520,3456,3457],{},"Number of samples along x, y, z of the target grid",[502,3459,3460,3464,3466],{},[520,3461,3462],{},[461,3463,1050],{},[520,3465,1956],{},[520,3467,3468],{},"Physical size of one target grid step",[502,3470,3471,3475,3477],{},[520,3472,3473],{},[461,3474,1063],{},[520,3476,1956],{},[520,3478,3479,3480,3482],{},"Position of target sample ",[461,3481,1200],{}," — local space for an unposed volume, world space for a posed one",[502,3484,3485,3489,3492],{},[520,3486,3487],{},[461,3488,1076],{},[520,3490,3491],{},"volume's own dtype",[520,3493,3494],{},"The sample type of the resampled field",[450,3496,3497,3498,3501,3502,3505,3506,3508,3509,3511],{},"Each target node at ",[461,3499,3500],{},"origin + index * spacing"," takes the field's trilinear value. An unposed volume regrids in its own local space, clamped at the edge; a ",[626,3503,3504],{"href":1227},"posed"," one regrids ",[1385,3507,1829],{}," its pose — the target grid is world space and a node outside the posed domain takes a sentinel above the field's maximum. The result is a new, unposed volume standing on the grid that was asked for. Use it to downsample for preview or to align two fields onto one grid; it is the regrid ",[461,3510,1578],{}," resamples its operands through.",[783,3513,3515],{"id":3514},"slice-contours","Slice Contours",[1357,3517,1521],{"id":1521},[454,3519,3521],{"className":456,"code":3520,"language":458,"meta":459,"style":459},"paths, points = tf.volume_slice_contours(\n    vol,\n    plane_origin=(-3.2, -3.2, 0.0),\n    u=(1.0, 0.0, 0.0),\n    v=(0.0, 1.0, 0.0),\n    dims2=(256, 256),\n    spacing2=(0.025, 0.025),\n    isovalues=[-0.25, 0.0, 0.25],\n)\n",[461,3522,3523,3543,3551,3572,3591,3611,3628,3645,3667],{"__ignoreMap":459},[464,3524,3525,3528,3530,3532,3534,3536,3538,3540],{"class":466,"line":467},[464,3526,3527],{"class":474},"paths",[464,3529,662],{"class":641},[464,3531,754],{"class":474},[464,3533,642],{"class":641},[464,3535,645],{"class":474},[464,3537,648],{"class":641},[464,3539,1521],{"class":651},[464,3541,3542],{"class":641},"(\n",[464,3544,3545,3548],{"class":466,"line":484},[464,3546,3547],{"class":651},"    vol",[464,3549,3550],{"class":641},",\n",[464,3552,3553,3556,3558,3560,3562,3564,3566,3568,3570],{"class":466,"line":739},[464,3554,3555],{"class":861},"    plane_origin",[464,3557,1010],{"class":641},[464,3559,695],{"class":658},[464,3561,662],{"class":641},[464,3563,700],{"class":641},[464,3565,695],{"class":658},[464,3567,662],{"class":641},[464,3569,724],{"class":658},[464,3571,711],{"class":641},[464,3573,3574,3577,3579,3581,3583,3585,3587,3589],{"class":466,"line":746},[464,3575,3576],{"class":861},"    u",[464,3578,989],{"class":641},[464,3580,2055],{"class":658},[464,3582,662],{"class":641},[464,3584,724],{"class":658},[464,3586,662],{"class":641},[464,3588,724],{"class":658},[464,3590,711],{"class":641},[464,3592,3593,3596,3598,3600,3602,3605,3607,3609],{"class":466,"line":951},[464,3594,3595],{"class":861},"    v",[464,3597,989],{"class":641},[464,3599,719],{"class":658},[464,3601,662],{"class":641},[464,3603,3604],{"class":658}," 1.0",[464,3606,662],{"class":641},[464,3608,724],{"class":658},[464,3610,711],{"class":641},[464,3612,3613,3616,3618,3621,3623,3626],{"class":466,"line":1004},[464,3614,3615],{"class":861},"    dims2",[464,3617,989],{"class":641},[464,3619,3620],{"class":658},"256",[464,3622,662],{"class":641},[464,3624,3625],{"class":658}," 256",[464,3627,711],{"class":641},[464,3629,3630,3633,3635,3638,3640,3643],{"class":466,"line":1030},[464,3631,3632],{"class":861},"    spacing2",[464,3634,989],{"class":641},[464,3636,3637],{"class":658},"0.025",[464,3639,662],{"class":641},[464,3641,3642],{"class":658}," 0.025",[464,3644,711],{"class":641},[464,3646,3647,3650,3653,3656,3658,3660,3662,3664],{"class":466,"line":1043},[464,3648,3649],{"class":861},"    isovalues",[464,3651,3652],{"class":641},"=[-",[464,3654,3655],{"class":658},"0.25",[464,3657,662],{"class":641},[464,3659,724],{"class":658},[464,3661,662],{"class":641},[464,3663,2638],{"class":658},[464,3665,3666],{"class":641},"],\n",[464,3668,3669],{"class":466,"line":1056},[464,3670,736],{"class":641},[496,3672,3673,3683],{},[499,3674,3675],{},[502,3676,3677,3679,3681],{},[505,3678,1141],{},[505,3680,1943],{},[505,3682,1147],{},[515,3684,3685,3695,3710,3725,3737,3749,3761],{},[502,3686,3687,3691,3693],{},[520,3688,3689],{},[461,3690,785],{},[520,3692,1956],{},[520,3694,2704],{},[502,3696,3697,3702,3704],{},[520,3698,3699],{},[461,3700,3701],{},"plane_origin",[520,3703,1956],{},[520,3705,3706,3707],{},"Local-space position of slice grid node ",[461,3708,3709],{},"(0, 0)",[502,3711,3712,3720,3722],{},[520,3713,3714,1404,3717],{},[461,3715,3716],{},"u",[461,3718,3719],{},"v",[520,3721,1956],{},[520,3723,3724],{},"Unit 3D directions of the slice grid's i and j axes",[502,3726,3727,3732,3734],{},[520,3728,3729],{},[461,3730,3731],{},"dims2",[520,3733,1956],{},[520,3735,3736],{},"Number of slice grid nodes along u and v",[502,3738,3739,3744,3746],{},[520,3740,3741],{},[461,3742,3743],{},"spacing2",[520,3745,1956],{},[520,3747,3748],{},"Slice grid step along u and v",[502,3750,3751,3756,3758],{},[520,3752,3753],{},[461,3754,3755],{},"isovalues",[520,3757,1956],{},[520,3759,3760],{},"A single isovalue or a sequence of them, all contoured on the same slice",[502,3762,3763,3767,3771],{},[520,3764,3765],{},[461,3766,1076],{},[520,3768,2778,3769],{},[461,3770,1224],{},[520,3772,2783],{},[450,3774,3775,3776,3779,3780,3783,3784,3786],{},"The volume is resampled once onto the plane's 2D grid and every isovalue is contoured on that slice. Node ",[461,3777,3778],{},"(i, j)"," samples the volume at ",[461,3781,3782],{},"plane_origin + i * spacing2[0] * u + j * spacing2[1] * v"," — the plane is stated in the volume's local space — and each contour point is lifted into world space for a ",[626,3785,3504],{"href":1227}," volume, and into the volume's local frame otherwise.",[450,3788,3789,3790,1515,3793,3795,3796,3802,3803,3805,3806,3809],{},"The result is ",[1385,3791,3792],{},"connected polylines",[461,3794,3527],{}," is an ",[626,3797,3799],{"href":3798},"\u002Fpy\u002Fmodules\u002Fcore#offsetblockedarray",[461,3800,3801],{},"OffsetBlockedArray"," of point indices and ",[461,3804,2795],{}," is ",[461,3807,3808],{},"(P, 3)"," in the requested dtype, so a path indexes the point array directly. A closed contour repeats its first index last. The crossings are welded, so the connection is topological rather than a coordinate search.",[454,3811,3813],{"className":456,"code":3812,"language":458,"meta":459,"style":459},"for path in paths:\n    polyline = points[path]        # (len(path), 3)\n",[461,3814,3815,3832],{"__ignoreMap":459},[464,3816,3817,3820,3823,3826,3829],{"class":466,"line":467},[464,3818,3819],{"class":470},"for",[464,3821,3822],{"class":474}," path ",[464,3824,3825],{"class":470},"in",[464,3827,3828],{"class":474}," paths",[464,3830,3831],{"class":641},":\n",[464,3833,3834,3837,3839,3841,3843,3846,3848],{"class":466,"line":484},[464,3835,3836],{"class":474},"    polyline ",[464,3838,642],{"class":641},[464,3840,2079],{"class":474},[464,3842,1105],{"class":641},[464,3844,3845],{"class":474},"path",[464,3847,1121],{"class":641},[464,3849,3850],{"class":774},"        # (len(path), 3)\n",[450,3852,3853],{},"Contours terminate cleanly at the volume boundary: slice nodes outside the grid receive a sentinel above the field's maximum, so no isovalue the field carries is crossed there.",[783,3855,3857],{"id":3856},"reading-and-writing-volumes","Reading and Writing Volumes",[450,3859,3860,1518,3862,3864,3865,3868,3869,3872,3873,3876],{},[461,3861,610],{},[461,3863,614],{}," move volumes through NIfTI-1 as ",[461,3866,3867],{},".nii"," or ",[461,3870,3871],{},".nii.gz",". See ",[626,3874,96],{"href":3875},"\u002Fpy\u002Fmodules\u002Fio#nifti-volumes"," for the full contract.",[454,3878,3880],{"className":456,"code":3879,"language":458,"meta":459,"style":459},"scan = tf.read_nifti(\"ct.nii.gz\")           # native dtype, posed if the file is\nfaces, points = tf.isosurface(scan, 300.0)  # patient space\ntf.write_nifti(scan, \"copy.nii.gz\")\n",[461,3881,3882,3910,3940],{"__ignoreMap":459},[464,3883,3884,3887,3889,3891,3893,3896,3898,3900,3903,3905,3907],{"class":466,"line":467},[464,3885,3886],{"class":474},"scan ",[464,3888,642],{"class":641},[464,3890,645],{"class":474},[464,3892,648],{"class":641},[464,3894,3895],{"class":651},"read_nifti",[464,3897,766],{"class":641},[464,3899,867],{"class":641},[464,3901,3902],{"class":870},"ct.nii.gz",[464,3904,867],{"class":641},[464,3906,628],{"class":641},[464,3908,3909],{"class":774},"           # native dtype, posed if the file is\n",[464,3911,3912,3914,3916,3918,3920,3922,3924,3926,3928,3931,3933,3935,3937],{"class":466,"line":484},[464,3913,749],{"class":474},[464,3915,662],{"class":641},[464,3917,754],{"class":474},[464,3919,642],{"class":641},[464,3921,645],{"class":474},[464,3923,648],{"class":641},[464,3925,763],{"class":651},[464,3927,766],{"class":641},[464,3929,3930],{"class":651},"scan",[464,3932,662],{"class":641},[464,3934,1716],{"class":658},[464,3936,628],{"class":641},[464,3938,3939],{"class":774},"  # patient space\n",[464,3941,3942,3944,3946,3949,3951,3953,3955,3957,3960,3962],{"class":466,"line":739},[464,3943,2156],{"class":474},[464,3945,648],{"class":641},[464,3947,3948],{"class":651},"write_nifti",[464,3950,766],{"class":641},[464,3952,3930],{"class":651},[464,3954,662],{"class":641},[464,3956,2950],{"class":641},[464,3958,3959],{"class":870},"copy.nii.gz",[464,3961,867],{"class":641},[464,3963,736],{"class":641},[450,3965,3966,3967,3969,3970,3973],{},"A posed file lands its affine in ",[461,3968,1210],{},", so the isosurface of a scan is a patient-space mesh with no further step. ",[461,3971,3972],{},"tf.read_nifti_header(path)"," answers the file's facts — dtype, dims, spacing, units, whether it is posed — without reading the samples.",[783,3975,3977],{"id":3976},"naming","Naming",[450,3979,3980,3981,1404,3983,3985,3986,1404,3989,3992,3993,4005,4006,4009],{},"The Python names keep their carrier — ",[461,3982,1578],{},[461,3984,1521],{}," — where C++ distinguishes the same operations by overload (",[461,3987,3988],{},"tf::make_boolean",[461,3990,3991],{},"tf::make_isocontours","). Python has no type-distinguished overloading, and its mesh boolean is spelled ",[626,3994,3996,611,3999,611,4002],{"href":3995},"\u002Fpy\u002Fmodules\u002Fcsg#boolean-operations",[461,3997,3998],{},"boolean_union",[461,4000,4001],{},"boolean_intersection",[461,4003,4004],{},"boolean_difference"," rather than one ",[461,4007,4008],{},"boolean"," the volume could join.",[4011,4012,4013],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":459,"searchDepth":467,"depth":484,"links":4015},[4016,4021,4025,4028,4031,4034,4037,4038],{"id":785,"depth":484,"text":101,"children":4017},[4018,4019,4020],{"id":1359,"depth":739,"text":1360},{"id":1535,"depth":739,"text":1536},{"id":1734,"depth":739,"text":1228},{"id":1841,"depth":484,"text":1842,"children":4022},[4023,4024],{"id":652,"depth":739,"text":652},{"id":1531,"depth":739,"text":1531},{"id":2580,"depth":484,"text":2581,"children":4026},[4027],{"id":763,"depth":739,"text":763},{"id":2915,"depth":484,"text":2916,"children":4029},[4030],{"id":1578,"depth":739,"text":1578},{"id":3347,"depth":484,"text":3348,"children":4032},[4033],{"id":1590,"depth":739,"text":1590},{"id":3514,"depth":484,"text":3515,"children":4035},[4036],{"id":1521,"depth":739,"text":1521},{"id":3856,"depth":484,"text":3857},{"id":3976,"depth":484,"text":3977},"Dense scalar grids — signed distance fields, CSG, slicing, and isosurfaces.","md",null,{},{"icon":104},{"title":101,"description":4039},{"loc":102},"ZIcEWeXptNn81NgTxHRHVmA2ZYK-fHAiG2dIhMrJbAA",[4048,4050],{"title":96,"path":97,"stem":98,"description":4049,"icon":99,"children":-1},"File I\u002FO operations for reading and writing mesh data.",{"title":106,"path":107,"stem":108,"description":4051,"icon":109,"children":-1},"Performance comparisons against MeshLib, VTK, CGAL, libigl, Coal, FCL, and nanoflann.",1789502625247]