[{"data":1,"prerenderedAt":2983},["ShallowReactive",2],{"navigation-docsCpp":3,"lib-picker-navigation":192,"docsCpp-\u002Fcpp\u002Fexamples\u002Farrangements":445,"docsCpp-\u002Fcpp\u002Fexamples\u002Farrangements-surround":2978},[4],{"title":5,"path":6,"stem":7,"children":8,"page":27},"Cpp","\u002Fcpp","cpp",[9,28,91,119,143,173],{"title":10,"path":11,"stem":12,"children":13,"icon":27},"Getting Started","\u002Fcpp\u002Fgetting-started","cpp\u002F1.getting-started\u002F1.index",[14,17,22],{"title":15,"path":11,"stem":12,"icon":16},"Introduction","i-lucide-house",{"title":18,"path":19,"stem":20,"icon":21},"Installation","\u002Fcpp\u002Fgetting-started\u002Finstallation","cpp\u002F1.getting-started\u002F2.installation","i-lucide-download",{"title":23,"path":24,"stem":25,"icon":26},"Live Examples","\u002Fcpp\u002Fgetting-started\u002Flive-examples","cpp\u002F1.getting-started\u002F3.live-examples","i-lucide-play",false,{"title":29,"path":30,"stem":31,"children":32,"icon":27},"Modules","\u002Fcpp\u002Fmodules","cpp\u002F2.modules\u002F00.index",[33,36,41,46,51,56,61,66,71,76,81,86],{"title":34,"path":30,"stem":31,"icon":35},"Overview","i-lucide-library",{"title":37,"path":38,"stem":39,"icon":40},"Core","\u002Fcpp\u002Fmodules\u002Fcore","cpp\u002F2.modules\u002F01.core","i-lucide-atom",{"title":42,"path":43,"stem":44,"icon":45},"Spatial","\u002Fcpp\u002Fmodules\u002Fspatial","cpp\u002F2.modules\u002F02.spatial","i-lucide-scale-3d",{"title":47,"path":48,"stem":49,"icon":50},"Topology","\u002Fcpp\u002Fmodules\u002Ftopology","cpp\u002F2.modules\u002F03.topology","i-lucide-git-graph",{"title":52,"path":53,"stem":54,"icon":55},"Geometry","\u002Fcpp\u002Fmodules\u002Fgeometry","cpp\u002F2.modules\u002F04.geometry","i-lucide-ruler",{"title":57,"path":58,"stem":59,"icon":60},"Remesh","\u002Fcpp\u002Fmodules\u002Fremesh","cpp\u002F2.modules\u002F05.remesh","i-lucide-triangle",{"title":62,"path":63,"stem":64,"icon":65},"Intersect","\u002Fcpp\u002Fmodules\u002Fintersect","cpp\u002F2.modules\u002F06.intersect","i-lucide-squares-intersect",{"title":67,"path":68,"stem":69,"icon":70},"Cut","\u002Fcpp\u002Fmodules\u002Fcut","cpp\u002F2.modules\u002F07.cut","i-lucide-scissors",{"title":72,"path":73,"stem":74,"icon":75},"CSG","\u002Fcpp\u002Fmodules\u002Fcsg","cpp\u002F2.modules\u002F08.csg","i-lucide-shapes",{"title":77,"path":78,"stem":79,"icon":80},"Clean","\u002Fcpp\u002Fmodules\u002Fclean","cpp\u002F2.modules\u002F09.clean","i-lucide-sparkles",{"title":82,"path":83,"stem":84,"icon":85},"Reindex","\u002Fcpp\u002Fmodules\u002Freindex","cpp\u002F2.modules\u002F10.reidx","i-lucide-shuffle",{"title":87,"path":88,"stem":89,"icon":90},"I\u002FO","\u002Fcpp\u002Fmodules\u002Fio","cpp\u002F2.modules\u002F11.io","i-lucide-file-input",{"title":92,"path":93,"stem":94,"children":95,"icon":27},"Benchmarks","\u002Fcpp\u002Fbenchmarks","cpp\u002F3.benchmarks\u002F1.index",[96,98,101,104,107,110,113,116],{"title":34,"path":93,"stem":94,"icon":97},"i-lucide-chart-bar-stacked",{"title":42,"path":99,"stem":100,"icon":45},"\u002Fcpp\u002Fbenchmarks\u002Fspatial","cpp\u002F3.benchmarks\u002F2.spatial",{"title":47,"path":102,"stem":103,"icon":50},"\u002Fcpp\u002Fbenchmarks\u002Ftopology","cpp\u002F3.benchmarks\u002F3.topology",{"title":52,"path":105,"stem":106,"icon":55},"\u002Fcpp\u002Fbenchmarks\u002Fgeometry","cpp\u002F3.benchmarks\u002F4.geometry",{"title":57,"path":108,"stem":109,"icon":60},"\u002Fcpp\u002Fbenchmarks\u002Fremesh","cpp\u002F3.benchmarks\u002F5.remesh",{"title":62,"path":111,"stem":112,"icon":65},"\u002Fcpp\u002Fbenchmarks\u002Fintersect","cpp\u002F3.benchmarks\u002F6.intersect",{"title":67,"path":114,"stem":115,"icon":70},"\u002Fcpp\u002Fbenchmarks\u002Fcut","cpp\u002F3.benchmarks\u002F7.cut",{"title":87,"path":117,"stem":118,"icon":90},"\u002Fcpp\u002Fbenchmarks\u002Fio","cpp\u002F3.benchmarks\u002F8.io",{"title":120,"path":121,"stem":122,"children":123,"icon":27},"VTK","\u002Fcpp\u002Fvtk","cpp\u002F4.vtk\u002F1.index",[124,126,129,134,139],{"title":34,"path":121,"stem":122,"icon":125},"i-lucide-layers",{"title":37,"path":127,"stem":128,"icon":40},"\u002Fcpp\u002Fvtk\u002Fcore","cpp\u002F4.vtk\u002F2.core",{"title":130,"path":131,"stem":132,"icon":133},"Functions","\u002Fcpp\u002Fvtk\u002Ffunctions","cpp\u002F4.vtk\u002F3.functions","i-lucide-function-square",{"title":135,"path":136,"stem":137,"icon":138},"Filters","\u002Fcpp\u002Fvtk\u002Ffilters","cpp\u002F4.vtk\u002F4.filters","i-lucide-filter",{"title":140,"path":141,"stem":142,"icon":26},"Examples","\u002Fcpp\u002Fvtk\u002Fexamples","cpp\u002F4.vtk\u002F5.examples",{"title":140,"path":144,"stem":145,"children":146,"icon":27},"\u002Fcpp\u002Fexamples","cpp\u002F5.examples\u002F0.index",[147,149,154,159,164,168],{"title":34,"path":144,"stem":145,"icon":148},"i-lucide-book-open",{"title":150,"path":151,"stem":152,"icon":153},"Geometry Walkthrough","\u002Fcpp\u002Fexamples\u002Fmesh-assembly","cpp\u002F5.examples\u002F1.mesh-assembly","i-lucide-box",{"title":155,"path":156,"stem":157,"icon":158},"Point Cloud Alignment","\u002Fcpp\u002Fexamples\u002Falignment","cpp\u002F5.examples\u002F2.alignment","i-lucide-move",{"title":160,"path":161,"stem":162,"icon":163},"Arrangements and Volumes","\u002Fcpp\u002Fexamples\u002Farrangements","cpp\u002F5.examples\u002F3.arrangements","i-lucide-layers-3",{"title":165,"path":166,"stem":167,"icon":125},"VTK Integration","\u002Fcpp\u002Fexamples\u002Fvtk","cpp\u002F5.examples\u002F4.vtk",{"title":169,"path":170,"stem":171,"icon":172},"Coming from Other Libraries","\u002Fcpp\u002Fexamples\u002Flibrary-comparisons","cpp\u002F5.examples\u002F5.library-comparisons","i-lucide-git-compare",{"title":174,"path":175,"stem":176,"children":177,"page":27},"About","\u002Fcpp\u002Fabout","cpp\u002F6.about",[178,182,187],{"title":179,"path":180,"stem":181,"icon":148},"Research","\u002Fcpp\u002Fabout\u002Fresearch","cpp\u002F6.about\u002F1.research",{"title":183,"path":184,"stem":185,"icon":186},"Contributing","\u002Fcpp\u002Fabout\u002Fcontributing","cpp\u002F6.about\u002F2.contributing","i-lucide-heart-handshake",{"title":188,"path":189,"stem":190,"icon":191},"License","\u002Fcpp\u002Fabout\u002Flicense","cpp\u002F6.about\u002F3.license","i-lucide-file-text",{"cpp":193,"py":245,"ts":358},[194],{"title":5,"path":6,"stem":7,"children":195,"page":27},[196,201,215,225,232,240],{"title":10,"path":11,"stem":12,"children":197,"icon":27},[198,199,200],{"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":29,"path":30,"stem":31,"children":202,"icon":27},[203,204,205,206,207,208,209,210,211,212,213,214],{"title":34,"path":30,"stem":31,"icon":35},{"title":37,"path":38,"stem":39,"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":90},{"title":92,"path":93,"stem":94,"children":216,"icon":27},[217,218,219,220,221,222,223,224],{"title":34,"path":93,"stem":94,"icon":97},{"title":42,"path":99,"stem":100,"icon":45},{"title":47,"path":102,"stem":103,"icon":50},{"title":52,"path":105,"stem":106,"icon":55},{"title":57,"path":108,"stem":109,"icon":60},{"title":62,"path":111,"stem":112,"icon":65},{"title":67,"path":114,"stem":115,"icon":70},{"title":87,"path":117,"stem":118,"icon":90},{"title":120,"path":121,"stem":122,"children":226,"icon":27},[227,228,229,230,231],{"title":34,"path":121,"stem":122,"icon":125},{"title":37,"path":127,"stem":128,"icon":40},{"title":130,"path":131,"stem":132,"icon":133},{"title":135,"path":136,"stem":137,"icon":138},{"title":140,"path":141,"stem":142,"icon":26},{"title":140,"path":144,"stem":145,"children":233,"icon":27},[234,235,236,237,238,239],{"title":34,"path":144,"stem":145,"icon":148},{"title":150,"path":151,"stem":152,"icon":153},{"title":155,"path":156,"stem":157,"icon":158},{"title":160,"path":161,"stem":162,"icon":163},{"title":165,"path":166,"stem":167,"icon":125},{"title":169,"path":170,"stem":171,"icon":172},{"title":174,"path":175,"stem":176,"children":241,"page":27},[242,243,244],{"title":179,"path":180,"stem":181,"icon":148},{"title":183,"path":184,"stem":185,"icon":186},{"title":188,"path":189,"stem":190,"icon":191},[246],{"title":247,"path":248,"stem":249,"children":250,"page":27},"Py","\u002Fpy","py",[251,262,297,302,323,345],{"title":10,"path":252,"stem":253,"children":254,"icon":27},"\u002Fpy\u002Fgetting-started","py\u002F1.getting-started\u002F1.index",[255,256,259],{"title":15,"path":252,"stem":253,"icon":16},{"title":18,"path":257,"stem":258,"icon":21},"\u002Fpy\u002Fgetting-started\u002Finstallation","py\u002F1.getting-started\u002F2.installation",{"title":23,"path":260,"stem":261,"icon":26},"\u002Fpy\u002Fgetting-started\u002Flive-examples","py\u002F1.getting-started\u002F3.live-examples",{"title":29,"path":263,"stem":264,"children":265,"icon":27},"\u002Fpy\u002Fmodules","py\u002F2.modules\u002F00.index",[266,267,270,273,276,279,282,285,288,291,294],{"title":34,"path":263,"stem":264,"icon":35},{"title":37,"path":268,"stem":269,"icon":40},"\u002Fpy\u002Fmodules\u002Fcore","py\u002F2.modules\u002F01.core",{"title":42,"path":271,"stem":272,"icon":45},"\u002Fpy\u002Fmodules\u002Fspatial","py\u002F2.modules\u002F02.spatial",{"title":47,"path":274,"stem":275,"icon":50},"\u002Fpy\u002Fmodules\u002Ftopology","py\u002F2.modules\u002F03.topology",{"title":52,"path":277,"stem":278,"icon":55},"\u002Fpy\u002Fmodules\u002Fgeometry","py\u002F2.modules\u002F04.geometry",{"title":57,"path":280,"stem":281,"icon":60},"\u002Fpy\u002Fmodules\u002Fremesh","py\u002F2.modules\u002F05.remesh",{"title":62,"path":283,"stem":284,"icon":65},"\u002Fpy\u002Fmodules\u002Fintersect","py\u002F2.modules\u002F06.intersect",{"title":67,"path":286,"stem":287,"icon":70},"\u002Fpy\u002Fmodules\u002Fcut","py\u002F2.modules\u002F07.cut",{"title":77,"path":289,"stem":290,"icon":80},"\u002Fpy\u002Fmodules\u002Fclean","py\u002F2.modules\u002F08.clean",{"title":82,"path":292,"stem":293,"icon":85},"\u002Fpy\u002Fmodules\u002Freindex","py\u002F2.modules\u002F09.reidx",{"title":87,"path":295,"stem":296,"icon":90},"\u002Fpy\u002Fmodules\u002Fio","py\u002F2.modules\u002F10.io",{"title":92,"path":298,"stem":299,"children":300,"icon":27},"\u002Fpy\u002Fbenchmarks","py\u002F3.benchmarks\u002F1.index",[301],{"title":34,"path":298,"stem":299,"icon":97},{"title":303,"path":304,"stem":305,"children":306,"icon":27},"Blender","\u002Fpy\u002Fblender","py\u002F4.blender\u002F1.index",[307,309,314,318],{"title":34,"path":304,"stem":305,"icon":308},"i-vscode-icons:file-type-blender",{"title":310,"path":311,"stem":312,"icon":313},"Convert","\u002Fpy\u002Fblender\u002Fconvert","py\u002F4.blender\u002F2.convert","i-lucide-repeat",{"title":315,"path":316,"stem":317,"icon":125},"Scene","\u002Fpy\u002Fblender\u002Fscene","py\u002F4.blender\u002F3.scene",{"title":319,"path":320,"stem":321,"icon":322},"Plugin Architecture","\u002Fpy\u002Fblender\u002Fplugin","py\u002F4.blender\u002F4.plugin","i-lucide-puzzle",{"title":140,"path":324,"stem":325,"children":326,"icon":27},"\u002Fpy\u002Fexamples","py\u002F5.examples\u002F0.index",[327,328,333,336,340],{"title":34,"path":324,"stem":325,"icon":148},{"title":329,"path":330,"stem":331,"icon":332},"Core Functionality","\u002Fpy\u002Fexamples\u002Fcore-functionality","py\u002F5.examples\u002F2.core-functionality","i-lucide-code",{"title":160,"path":334,"stem":335,"icon":163},"\u002Fpy\u002Fexamples\u002Farrangements","py\u002F5.examples\u002F3.arrangements",{"title":165,"path":337,"stem":338,"icon":339},"\u002Fpy\u002Fexamples\u002Fvtk-integration","py\u002F5.examples\u002F4.vtk-integration","i-lucide-grid-2x2",{"title":341,"path":342,"stem":343,"icon":344},"Raycast Rendering","\u002Fpy\u002Fexamples\u002Fraycast-rendering","py\u002F5.examples\u002F5.raycast-rendering","i-lucide-scan-line",{"title":174,"path":346,"stem":347,"children":348,"page":27},"\u002Fpy\u002Fabout","py\u002F6.about",[349,352,355],{"title":179,"path":350,"stem":351,"icon":148},"\u002Fpy\u002Fabout\u002Fresearch","py\u002F6.about\u002F1.research",{"title":183,"path":353,"stem":354,"icon":186},"\u002Fpy\u002Fabout\u002Fcontributing","py\u002F6.about\u002F2.contributing",{"title":188,"path":356,"stem":357,"icon":191},"\u002Fpy\u002Fabout\u002Flicense","py\u002F6.about\u002F3.license",[359],{"title":360,"path":361,"stem":362,"children":363,"page":27},"Ts","\u002Fts","ts",[364,375,410,415,432],{"title":10,"path":365,"stem":366,"children":367,"icon":27},"\u002Fts\u002Fgetting-started","ts\u002F1.getting-started\u002F1.index",[368,369,372],{"title":15,"path":365,"stem":366,"icon":16},{"title":18,"path":370,"stem":371,"icon":21},"\u002Fts\u002Fgetting-started\u002Finstallation","ts\u002F1.getting-started\u002F2.installation",{"title":23,"path":373,"stem":374,"icon":26},"\u002Fts\u002Fgetting-started\u002Flive-examples","ts\u002F1.getting-started\u002F3.live-examples",{"title":29,"path":376,"stem":377,"children":378,"icon":27},"\u002Fts\u002Fmodules","ts\u002F2.modules\u002F00.index",[379,380,383,386,389,392,395,398,401,404,407],{"title":34,"path":376,"stem":377,"icon":35},{"title":37,"path":381,"stem":382,"icon":40},"\u002Fts\u002Fmodules\u002Fcore","ts\u002F2.modules\u002F01.core",{"title":42,"path":384,"stem":385,"icon":45},"\u002Fts\u002Fmodules\u002Fspatial","ts\u002F2.modules\u002F02.spatial",{"title":47,"path":387,"stem":388,"icon":50},"\u002Fts\u002Fmodules\u002Ftopology","ts\u002F2.modules\u002F03.topology",{"title":52,"path":390,"stem":391,"icon":55},"\u002Fts\u002Fmodules\u002Fgeometry","ts\u002F2.modules\u002F04.geometry",{"title":57,"path":393,"stem":394,"icon":60},"\u002Fts\u002Fmodules\u002Fremesh","ts\u002F2.modules\u002F05.remesh",{"title":62,"path":396,"stem":397,"icon":65},"\u002Fts\u002Fmodules\u002Fintersect","ts\u002F2.modules\u002F06.intersect",{"title":67,"path":399,"stem":400,"icon":70},"\u002Fts\u002Fmodules\u002Fcut","ts\u002F2.modules\u002F07.cut",{"title":77,"path":402,"stem":403,"icon":80},"\u002Fts\u002Fmodules\u002Fclean","ts\u002F2.modules\u002F08.clean",{"title":82,"path":405,"stem":406,"icon":85},"\u002Fts\u002Fmodules\u002Freindex","ts\u002F2.modules\u002F09.reidx",{"title":87,"path":408,"stem":409,"icon":90},"\u002Fts\u002Fmodules\u002Fio","ts\u002F2.modules\u002F10.io",{"title":92,"path":411,"stem":412,"children":413,"icon":27},"\u002Fts\u002Fbenchmarks","ts\u002F3.benchmarks\u002F1.index",[414],{"title":34,"path":411,"stem":412,"icon":97},{"title":140,"path":416,"stem":417,"children":418,"icon":27},"\u002Fts\u002Fexamples","ts\u002F4.examples\u002F0.index",[419,420,423,428],{"title":34,"path":416,"stem":417,"icon":148},{"title":329,"path":421,"stem":422,"icon":332},"\u002Fts\u002Fexamples\u002Fcore-functionality","ts\u002F4.examples\u002F2.core-functionality",{"title":424,"path":425,"stem":426,"icon":427},"Alignment","\u002Fts\u002Fexamples\u002Falignment","ts\u002F4.examples\u002F3.alignment","i-lucide-move-3d",{"title":341,"path":429,"stem":430,"icon":431},"\u002Fts\u002Fexamples\u002Fraycast-render","ts\u002F4.examples\u002F4.raycast-render","i-lucide-image",{"title":174,"icon":27,"path":433,"stem":434,"children":435,"page":27},"\u002Fts\u002Fabout","ts\u002F5.about",[436,439,442],{"title":179,"path":437,"stem":438,"icon":148},"\u002Fts\u002Fabout\u002Fresearch","ts\u002F5.about\u002F1.research",{"title":183,"path":440,"stem":441,"icon":186},"\u002Fts\u002Fabout\u002Fcontributing","ts\u002F5.about\u002F2.contributing",{"title":188,"path":443,"stem":444,"icon":191},"\u002Fts\u002Fabout\u002Flicense","ts\u002F5.about\u002F3.license",{"id":446,"title":160,"body":447,"description":2971,"extension":2972,"links":2973,"meta":2974,"navigation":2975,"path":161,"seo":2976,"stem":162,"__hash__":2977},"docsCpp\u002Fcpp\u002F5.examples\u002F3.arrangements.md",{"type":448,"value":449,"toc":2959},"minimark",[450,454,468,473,476,491,495,498,1073,1080,1084,1150,1153,1188,1195,1199,1225,1331,1348,1359,1363,1427,1430,1469,1479,1507,1510,1514,1559,1576,1582,1586,1597,2135,2138,2194,2200,2204,2212,2307,2323,2327,2780,2797,2800,2808,2811,2815,2929,2955],[451,452,453],"p",{},"This walkthrough takes a small CSG-flavoured scene — two overlapping cubes and a bisecting plane — and pushes it through trueform's arrangement pipeline. The result is a set of closed, manifold, outward-oriented volumes, each labelled by which signed side of the plane it sits on.",[451,455,456,460,461],{},[457,458,459],"strong",{},"Source:"," ",[462,463,467],"a",{"href":464,"rel":465},"https:\u002F\u002Fgithub.com\u002Fpolydera\u002Ftrueform\u002Ftree\u002Fmain\u002Fexamples\u002Fsrc\u002Farrangements.cpp",[466],"nofollow","arrangements.cpp",[469,470,472],"h2",{"id":471},"what-the-pipeline-does","What the pipeline does",[474,475],"arrangements-pipeline-diagram",{},[451,477,478,482,483,486,487,490],{},[479,480,481],"code",{},"mesh_arrangements"," splits every face at every intersection and merges everything into one mesh, tagging each face with its source operand. ",[479,484,485],{},"make_domain_labels"," then partitions space into bounded volumetric regions (\"domains\"). ",[479,488,489],{},"split_into_domains"," finally emits one watertight outward-oriented submesh per domain. We add a small post-step that reads the slot convention on knife faces to label which volumes are above vs below the knife.",[469,492,494],{"id":493},"building-the-scene","Building the scene",[451,496,497],{},"Two unit cubes offset along the x-axis so they overlap in the middle, and a 4×4 plane on z=0. The cubes are positioned via lazy frames (no point copies); the plane sits at its build position.",[499,500,504],"pre",{"className":501,"code":502,"language":7,"meta":503,"style":503},"language-cpp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","auto cube0 = tf::make_box_mesh\u003CIndex>(Real(2), Real(2), Real(2));\nauto cube1 = tf::make_box_mesh\u003CIndex>(Real(2), Real(2), Real(2));\nauto plane = tf::make_plane_mesh\u003CIndex>(Real(4), Real(4));\n\nauto f0 = tf::make_frame(tf::make_transformation_from_translation(\n    tf::vector\u003CReal, 3>{Real(-0.5), Real(0), Real(0)}));\nauto f1 = tf::make_frame(tf::make_transformation_from_translation(\n    tf::vector\u003CReal, 3>{Real( 0.5), Real(0), Real(0)}));\nauto fid = tf::make_frame(tf::make_transformation_from_translation(\n    tf::vector\u003CReal, 3>{Real(0), Real(0), Real(0)}));\n\nauto p0 = cube0.polygons() | tf::tag(f0);    \u002F\u002F tag 0\nauto p1 = cube1.polygons() | tf::tag(f1);    \u002F\u002F tag 1\nauto p_knife = plane.polygons() | tf::tag(fid);  \u002F\u002F tag 2\n\ndecltype(p0) forms[] = {p0, p1, p_knife};\n","",[479,505,506,574,620,660,667,697,757,783,833,859,908,913,957,994,1031,1036],{"__ignoreMap":503},[507,508,511,515,519,523,527,530,534,537,540,543,546,549,553,556,559,561,563,565,567,569,571],"span",{"class":509,"line":510},"line",1,[507,512,514],{"class":513},"spNyl","auto",[507,516,518],{"class":517},"sTEyZ"," cube0 ",[507,520,522],{"class":521},"sMK4o","=",[507,524,526],{"class":525},"sBMFI"," tf",[507,528,529],{"class":521},"::",[507,531,533],{"class":532},"s2Zo4","make_box_mesh",[507,535,536],{"class":521},"\u003C",[507,538,539],{"class":525},"Index",[507,541,542],{"class":521},">(",[507,544,545],{"class":532},"Real",[507,547,548],{"class":521},"(",[507,550,552],{"class":551},"sbssI","2",[507,554,555],{"class":521},"),",[507,557,558],{"class":532}," Real",[507,560,548],{"class":521},[507,562,552],{"class":551},[507,564,555],{"class":521},[507,566,558],{"class":532},[507,568,548],{"class":521},[507,570,552],{"class":551},[507,572,573],{"class":521},"));\n",[507,575,577,579,582,584,586,588,590,592,594,596,598,600,602,604,606,608,610,612,614,616,618],{"class":509,"line":576},2,[507,578,514],{"class":513},[507,580,581],{"class":517}," cube1 ",[507,583,522],{"class":521},[507,585,526],{"class":525},[507,587,529],{"class":521},[507,589,533],{"class":532},[507,591,536],{"class":521},[507,593,539],{"class":525},[507,595,542],{"class":521},[507,597,545],{"class":532},[507,599,548],{"class":521},[507,601,552],{"class":551},[507,603,555],{"class":521},[507,605,558],{"class":532},[507,607,548],{"class":521},[507,609,552],{"class":551},[507,611,555],{"class":521},[507,613,558],{"class":532},[507,615,548],{"class":521},[507,617,552],{"class":551},[507,619,573],{"class":521},[507,621,623,625,628,630,632,634,637,639,641,643,645,647,650,652,654,656,658],{"class":509,"line":622},3,[507,624,514],{"class":513},[507,626,627],{"class":517}," plane ",[507,629,522],{"class":521},[507,631,526],{"class":525},[507,633,529],{"class":521},[507,635,636],{"class":532},"make_plane_mesh",[507,638,536],{"class":521},[507,640,539],{"class":525},[507,642,542],{"class":521},[507,644,545],{"class":532},[507,646,548],{"class":521},[507,648,649],{"class":551},"4",[507,651,555],{"class":521},[507,653,558],{"class":532},[507,655,548],{"class":521},[507,657,649],{"class":551},[507,659,573],{"class":521},[507,661,663],{"class":509,"line":662},4,[507,664,666],{"emptyLinePlaceholder":665},true,"\n",[507,668,670,672,675,677,679,681,684,686,689,691,694],{"class":509,"line":669},5,[507,671,514],{"class":513},[507,673,674],{"class":517}," f0 ",[507,676,522],{"class":521},[507,678,526],{"class":525},[507,680,529],{"class":521},[507,682,683],{"class":532},"make_frame",[507,685,548],{"class":521},[507,687,688],{"class":525},"tf",[507,690,529],{"class":521},[507,692,693],{"class":532},"make_transformation_from_translation",[507,695,696],{"class":521},"(\n",[507,698,700,703,705,708,710,712,715,718,721,724,726,729,732,734,736,738,741,743,745,747,749,752,755],{"class":509,"line":699},6,[507,701,702],{"class":525},"    tf",[507,704,529],{"class":521},[507,706,707],{"class":517},"vector",[507,709,536],{"class":521},[507,711,545],{"class":517},[507,713,714],{"class":521},",",[507,716,717],{"class":551}," 3",[507,719,720],{"class":521},">",[507,722,723],{"class":517},"{",[507,725,545],{"class":532},[507,727,728],{"class":521},"(-",[507,730,731],{"class":551},"0.5",[507,733,555],{"class":521},[507,735,558],{"class":532},[507,737,548],{"class":521},[507,739,740],{"class":551},"0",[507,742,555],{"class":521},[507,744,558],{"class":532},[507,746,548],{"class":521},[507,748,740],{"class":551},[507,750,751],{"class":521},")",[507,753,754],{"class":517},"}",[507,756,573],{"class":521},[507,758,760,762,765,767,769,771,773,775,777,779,781],{"class":509,"line":759},7,[507,761,514],{"class":513},[507,763,764],{"class":517}," f1 ",[507,766,522],{"class":521},[507,768,526],{"class":525},[507,770,529],{"class":521},[507,772,683],{"class":532},[507,774,548],{"class":521},[507,776,688],{"class":525},[507,778,529],{"class":521},[507,780,693],{"class":532},[507,782,696],{"class":521},[507,784,786,788,790,792,794,796,798,800,802,804,806,808,811,813,815,817,819,821,823,825,827,829,831],{"class":509,"line":785},8,[507,787,702],{"class":525},[507,789,529],{"class":521},[507,791,707],{"class":517},[507,793,536],{"class":521},[507,795,545],{"class":517},[507,797,714],{"class":521},[507,799,717],{"class":551},[507,801,720],{"class":521},[507,803,723],{"class":517},[507,805,545],{"class":532},[507,807,548],{"class":521},[507,809,810],{"class":551}," 0.5",[507,812,555],{"class":521},[507,814,558],{"class":532},[507,816,548],{"class":521},[507,818,740],{"class":551},[507,820,555],{"class":521},[507,822,558],{"class":532},[507,824,548],{"class":521},[507,826,740],{"class":551},[507,828,751],{"class":521},[507,830,754],{"class":517},[507,832,573],{"class":521},[507,834,836,838,841,843,845,847,849,851,853,855,857],{"class":509,"line":835},9,[507,837,514],{"class":513},[507,839,840],{"class":517}," fid ",[507,842,522],{"class":521},[507,844,526],{"class":525},[507,846,529],{"class":521},[507,848,683],{"class":532},[507,850,548],{"class":521},[507,852,688],{"class":525},[507,854,529],{"class":521},[507,856,693],{"class":532},[507,858,696],{"class":521},[507,860,862,864,866,868,870,872,874,876,878,880,882,884,886,888,890,892,894,896,898,900,902,904,906],{"class":509,"line":861},10,[507,863,702],{"class":525},[507,865,529],{"class":521},[507,867,707],{"class":517},[507,869,536],{"class":521},[507,871,545],{"class":517},[507,873,714],{"class":521},[507,875,717],{"class":551},[507,877,720],{"class":521},[507,879,723],{"class":517},[507,881,545],{"class":532},[507,883,548],{"class":521},[507,885,740],{"class":551},[507,887,555],{"class":521},[507,889,558],{"class":532},[507,891,548],{"class":521},[507,893,740],{"class":551},[507,895,555],{"class":521},[507,897,558],{"class":532},[507,899,548],{"class":521},[507,901,740],{"class":551},[507,903,751],{"class":521},[507,905,754],{"class":517},[507,907,573],{"class":521},[507,909,911],{"class":509,"line":910},11,[507,912,666],{"emptyLinePlaceholder":665},[507,914,916,918,921,923,926,929,932,935,938,940,942,945,947,950,953],{"class":509,"line":915},12,[507,917,514],{"class":513},[507,919,920],{"class":517}," p0 ",[507,922,522],{"class":521},[507,924,925],{"class":517}," cube0",[507,927,928],{"class":521},".",[507,930,931],{"class":532},"polygons",[507,933,934],{"class":521},"()",[507,936,937],{"class":521}," |",[507,939,526],{"class":525},[507,941,529],{"class":521},[507,943,944],{"class":532},"tag",[507,946,548],{"class":521},[507,948,949],{"class":517},"f0",[507,951,952],{"class":521},");",[507,954,956],{"class":955},"sHwdD","    \u002F\u002F tag 0\n",[507,958,960,962,965,967,970,972,974,976,978,980,982,984,986,989,991],{"class":509,"line":959},13,[507,961,514],{"class":513},[507,963,964],{"class":517}," p1 ",[507,966,522],{"class":521},[507,968,969],{"class":517}," cube1",[507,971,928],{"class":521},[507,973,931],{"class":532},[507,975,934],{"class":521},[507,977,937],{"class":521},[507,979,526],{"class":525},[507,981,529],{"class":521},[507,983,944],{"class":532},[507,985,548],{"class":521},[507,987,988],{"class":517},"f1",[507,990,952],{"class":521},[507,992,993],{"class":955},"    \u002F\u002F tag 1\n",[507,995,997,999,1002,1004,1007,1009,1011,1013,1015,1017,1019,1021,1023,1026,1028],{"class":509,"line":996},14,[507,998,514],{"class":513},[507,1000,1001],{"class":517}," p_knife ",[507,1003,522],{"class":521},[507,1005,1006],{"class":517}," plane",[507,1008,928],{"class":521},[507,1010,931],{"class":532},[507,1012,934],{"class":521},[507,1014,937],{"class":521},[507,1016,526],{"class":525},[507,1018,529],{"class":521},[507,1020,944],{"class":532},[507,1022,548],{"class":521},[507,1024,1025],{"class":517},"fid",[507,1027,952],{"class":521},[507,1029,1030],{"class":955},"  \u002F\u002F tag 2\n",[507,1032,1034],{"class":509,"line":1033},15,[507,1035,666],{"emptyLinePlaceholder":665},[507,1037,1039,1042,1044,1047,1049,1052,1054,1057,1060,1062,1065,1067,1070],{"class":509,"line":1038},16,[507,1040,1041],{"class":513},"decltype",[507,1043,548],{"class":521},[507,1045,1046],{"class":517},"p0",[507,1048,751],{"class":521},[507,1050,1051],{"class":517}," forms[] ",[507,1053,522],{"class":521},[507,1055,1056],{"class":521}," {",[507,1058,1046],{"class":1059},"swJcz",[507,1061,714],{"class":521},[507,1063,1064],{"class":1059}," p1",[507,1066,714],{"class":521},[507,1068,1069],{"class":1059}," p_knife",[507,1071,1072],{"class":521},"};\n",[451,1074,1075,1076,1079],{},"The two cubes alone produce three bounded regions (cube0-only, intersection, cube1-only). The plane bisects all three, so we expect ",[457,1077,1078],{},"six"," bounded domains.",[469,1081,1083],{"id":1082},"building-the-arrangement","Building the arrangement",[499,1085,1087],{"className":501,"code":1086,"language":7,"meta":503,"style":503},"auto [arr_raw, tag_labels_raw, face_labels_raw] =\n    tf::make_mesh_arrangements(tf::make_range(forms, forms + 3));\n",[479,1088,1089,1115],{"__ignoreMap":503},[507,1090,1091,1093,1096,1099,1101,1104,1106,1109,1112],{"class":509,"line":510},[507,1092,514],{"class":513},[507,1094,1095],{"class":521}," [",[507,1097,1098],{"class":517},"arr_raw",[507,1100,714],{"class":521},[507,1102,1103],{"class":517}," tag_labels_raw",[507,1105,714],{"class":521},[507,1107,1108],{"class":517}," face_labels_raw",[507,1110,1111],{"class":521},"]",[507,1113,1114],{"class":521}," =\n",[507,1116,1117,1119,1121,1124,1126,1128,1130,1133,1135,1138,1140,1143,1146,1148],{"class":509,"line":576},[507,1118,702],{"class":525},[507,1120,529],{"class":521},[507,1122,1123],{"class":532},"make_mesh_arrangements",[507,1125,548],{"class":521},[507,1127,688],{"class":525},[507,1129,529],{"class":521},[507,1131,1132],{"class":532},"make_range",[507,1134,548],{"class":521},[507,1136,1137],{"class":517},"forms",[507,1139,714],{"class":521},[507,1141,1142],{"class":517}," forms ",[507,1144,1145],{"class":521},"+",[507,1147,717],{"class":551},[507,1149,573],{"class":521},[451,1151,1152],{},"The return is three buffers:",[1154,1155,1156,1162,1182],"ul",{},[1157,1158,1159,1161],"li",{},[479,1160,1098],{}," — the merged triangle mesh with all intersections resolved.",[1157,1163,1164,1167,1168,1171,1172,1174,1175,1178,1179,1181],{},[479,1165,1166],{},"tag_labels_raw[f]"," — which input operand face ",[479,1169,1170],{},"f"," came from (",[479,1173,740],{},", ",[479,1176,1177],{},"1",", or ",[479,1180,552],{}," here).",[1157,1183,1184,1187],{},[479,1185,1186],{},"face_labels_raw[f]"," — which face within that operand it came from.",[451,1189,1190,1191,1194],{},"For our scene this produces ",[457,1192,1193],{},"176 faces, 48 points"," before cleaning.",[469,1196,1198],{"id":1197},"cleaning-and-reindexing-tags","Cleaning and reindexing tags",[451,1200,1201,1204,1205,1208,1209,1212,1213,1216,1217,1220,1221,1224],{},[479,1202,1203],{},"tf::cleaned"," does three things in one pass: it ",[457,1206,1207],{},"merges coincident vertices"," within a tolerance, ",[457,1210,1211],{},"drops topologically degenerate triangles"," (faces that collapse to a point or edge after merging), and ",[457,1214,1215],{},"removes duplicate triangles",". With ",[479,1218,1219],{},"tf::return_index_map"," it also returns an index map describing exactly what happened to each face, so per-face attributes like ",[479,1222,1223],{},"tag_labels_raw"," can be reindexed through it to stay aligned with the cleaned mesh:",[499,1226,1228],{"className":501,"code":1227,"language":7,"meta":503,"style":503},"auto [arr, face_im, point_im] =\n    tf::cleaned(arr_raw.polygons(), tf::epsilon\u003CReal>, tf::return_index_map);\nauto tag_labels = tf::reindexed(tf::make_range(tag_labels_raw), face_im);\n",[479,1229,1230,1253,1297],{"__ignoreMap":503},[507,1231,1232,1234,1236,1239,1241,1244,1246,1249,1251],{"class":509,"line":510},[507,1233,514],{"class":513},[507,1235,1095],{"class":521},[507,1237,1238],{"class":517},"arr",[507,1240,714],{"class":521},[507,1242,1243],{"class":517}," face_im",[507,1245,714],{"class":521},[507,1247,1248],{"class":517}," point_im",[507,1250,1111],{"class":521},[507,1252,1114],{"class":521},[507,1254,1255,1257,1259,1262,1264,1266,1268,1270,1273,1275,1277,1280,1282,1284,1287,1289,1291,1294],{"class":509,"line":576},[507,1256,702],{"class":525},[507,1258,529],{"class":521},[507,1260,1261],{"class":532},"cleaned",[507,1263,548],{"class":521},[507,1265,1098],{"class":517},[507,1267,928],{"class":521},[507,1269,931],{"class":532},[507,1271,1272],{"class":521},"(),",[507,1274,526],{"class":525},[507,1276,529],{"class":521},[507,1278,1279],{"class":517},"epsilon",[507,1281,536],{"class":521},[507,1283,545],{"class":517},[507,1285,1286],{"class":521},">,",[507,1288,526],{"class":525},[507,1290,529],{"class":521},[507,1292,1293],{"class":517},"return_index_map",[507,1295,1296],{"class":521},");\n",[507,1298,1299,1301,1304,1306,1308,1310,1313,1315,1317,1319,1321,1323,1325,1327,1329],{"class":509,"line":622},[507,1300,514],{"class":513},[507,1302,1303],{"class":517}," tag_labels ",[507,1305,522],{"class":521},[507,1307,526],{"class":525},[507,1309,529],{"class":521},[507,1311,1312],{"class":532},"reindexed",[507,1314,548],{"class":521},[507,1316,688],{"class":525},[507,1318,529],{"class":521},[507,1320,1132],{"class":532},[507,1322,548],{"class":521},[507,1324,1223],{"class":517},[507,1326,555],{"class":521},[507,1328,1243],{"class":517},[507,1330,1296],{"class":521},[451,1332,1333,1336,1337,1340,1341,1344,1345,928],{},[479,1334,1335],{},"tf::reindexed"," runs the index map over the range and emits a new buffer with ",[479,1338,1339],{},"face_im.kept_ids()"," worth of entries — exactly the right length for the cleaned mesh. In our scene cleaning takes us from 176 → ",[457,1342,1343],{},"114 faces",", 48 → ",[457,1346,1347],{},"40 points",[1349,1350,1352],"tip",{"icon":1351},"i-lucide-info",[451,1353,1354,1355,1358],{},"This reindex pattern applies to any per-face attribute you want to carry through a cleaning step — colours, scalar fields, user IDs. The ",[479,1356,1357],{},"tf::index_map"," returned by index-destructive operations is the canonical handle.",[469,1360,1362],{"id":1361},"computing-domain-labels","Computing domain labels",[499,1364,1366],{"className":501,"code":1365,"language":7,"meta":503,"style":503},"auto dl = tf::make_domain_labels(arr.polygons(),\n                                 tf::domain_config::ignore_open_fragments |\n                                 tf::domain_config::exclude_outer_shell);\n",[479,1367,1368,1394,1412],{"__ignoreMap":503},[507,1369,1370,1372,1375,1377,1379,1381,1383,1385,1387,1389,1391],{"class":509,"line":510},[507,1371,514],{"class":513},[507,1373,1374],{"class":517}," dl ",[507,1376,522],{"class":521},[507,1378,526],{"class":525},[507,1380,529],{"class":521},[507,1382,485],{"class":532},[507,1384,548],{"class":521},[507,1386,1238],{"class":517},[507,1388,928],{"class":521},[507,1390,931],{"class":532},[507,1392,1393],{"class":521},"(),\n",[507,1395,1396,1399,1401,1404,1406,1409],{"class":509,"line":576},[507,1397,1398],{"class":525},"                                 tf",[507,1400,529],{"class":521},[507,1402,1403],{"class":525},"domain_config",[507,1405,529],{"class":521},[507,1407,1408],{"class":517},"ignore_open_fragments ",[507,1410,1411],{"class":521},"|\n",[507,1413,1414,1416,1418,1420,1422,1425],{"class":509,"line":622},[507,1415,1398],{"class":525},[507,1417,529],{"class":521},[507,1419,1403],{"class":525},[507,1421,529],{"class":521},[507,1423,1424],{"class":517},"exclude_outer_shell",[507,1426,1296],{"class":521},[451,1428,1429],{},"Two flags shape the output:",[1431,1432,1433,1446],"table",{},[1434,1435,1436],"thead",{},[1437,1438,1439,1443],"tr",{},[1440,1441,1442],"th",{},"Flag",[1440,1444,1445],{},"Effect",[1447,1448,1449,1460],"tbody",{},[1437,1450,1451,1457],{},[1452,1453,1454],"td",{},[479,1455,1456],{},"ignore_open_fragments",[1452,1458,1459],{},"Park face-sides bounding open fragments (in our scene: the plane's outer ring that pokes outside the cube union) at the sentinel label.",[1437,1461,1462,1466],{},[1452,1463,1464],{},[479,1465,1424],{},[1452,1467,1468],{},"Fold the unbounded universe domain into the same sentinel.",[451,1470,1471,1472,1475,1476,1478],{},"What survives is the bounded interior. For our scene ",[479,1473,1474],{},"dl.n_domains == 6",". Each face ",[479,1477,1170],{}," carries two domain ids:",[1154,1480,1481,1497],{},[1157,1482,1483,1486,1487,1489,1490,1493,1494,1496],{},[479,1484,1485],{},"dl.labels[f][0]"," — the domain that contains ",[479,1488,1170],{}," with ",[457,1491,1492],{},"reversed winding"," (the side ",[479,1495,1170],{},"'s stored normal points INTO).",[1157,1498,1499,1486,1502,1489,1504,928],{},[479,1500,1501],{},"dl.labels[f][1]",[479,1503,1170],{},[457,1505,1506],{},"forward winding",[451,1508,1509],{},"That two-slot encoding is what makes the signed-side selection in the next step trivial.",[469,1511,1513],{"id":1512},"extracting-the-volumes","Extracting the volumes",[499,1515,1517],{"className":501,"code":1516,"language":7,"meta":503,"style":503},"auto [volumes, comp_labels] = tf::split_into_domains(arr.polygons(), dl);\n",[479,1518,1519],{"__ignoreMap":503},[507,1520,1521,1523,1525,1528,1530,1533,1535,1538,1540,1542,1544,1546,1548,1550,1552,1554,1557],{"class":509,"line":510},[507,1522,514],{"class":513},[507,1524,1095],{"class":521},[507,1526,1527],{"class":517},"volumes",[507,1529,714],{"class":521},[507,1531,1532],{"class":517}," comp_labels",[507,1534,1111],{"class":521},[507,1536,1537],{"class":521}," =",[507,1539,526],{"class":525},[507,1541,529],{"class":521},[507,1543,489],{"class":532},[507,1545,548],{"class":521},[507,1547,1238],{"class":517},[507,1549,928],{"class":521},[507,1551,931],{"class":532},[507,1553,1272],{"class":521},[507,1555,1556],{"class":517}," dl",[507,1558,1296],{"class":521},[451,1560,1561,1564,1565,1568,1569,1572,1573,1575],{},[479,1562,1563],{},"volumes[i]"," is a ",[479,1566,1567],{},"tf::polygons_buffer"," — a standalone watertight, manifold, outward-oriented submesh for the domain ",[479,1570,1571],{},"comp_labels[i]",". ",[479,1574,489],{}," reverses side-0 emissions and keeps side-1 emissions, so each cap face ends up pointing outward of its volume by construction.",[451,1577,1578,1579,928],{},"For our scene: ",[457,1580,1581],{},"6 volumes",[469,1583,1585],{"id":1584},"selecting-volumes-by-signed-side-of-the-knife","Selecting volumes by signed side of the knife",[451,1587,1588,1589,1592,1593,1596],{},"The knife (tag 2) has stored normal +Z. By the slot convention above, ",[479,1590,1591],{},"labels[f, 0]"," for an interior knife face is the domain on the +Z side, and ",[479,1594,1595],{},"labels[f, 1]"," is on the −Z side. Walking all interior knife faces and collecting the unique domain ids per side gives us the split:",[499,1598,1600],{"className":501,"code":1599,"language":7,"meta":503,"style":503},"tf::buffer\u003CIndex> above_ids, below_ids;\ntf::generic_generate(\n    tf::zip(tag_labels, dl.labels), std::tie(above_ids, below_ids),\n    [&](auto elem, auto &buffers) {\n      auto [tag, sides] = elem;\n      if (tag != Index(2)) return;\n      auto above = sides[0];\n      auto below = sides[1];\n      if (above >= dl.n_domains || below >= dl.n_domains) return;\n      auto &[ab, be] = buffers;\n      if (std::find(ab.begin(), ab.end(), above) == ab.end())\n        ab.push_back(above);\n      if (std::find(be.begin(), be.end(), below) == be.end())\n        be.push_back(below);\n    });\n\nauto sort_unique = [](tf::buffer\u003CIndex> &b) {\n  tbb::parallel_sort(b.begin(), b.end());\n  b.erase_till_end(std::unique(b.begin(), b.end()));\n};\nsort_unique(above_ids);\nsort_unique(below_ids);\n",[479,1601,1602,1628,1639,1684,1711,1733,1763,1782,1799,1838,1862,1914,1931,1977,1993,1998,2002,2036,2067,2106,2111,2123],{"__ignoreMap":503},[507,1603,1604,1606,1608,1611,1613,1615,1617,1620,1622,1625],{"class":509,"line":510},[507,1605,688],{"class":525},[507,1607,529],{"class":521},[507,1609,1610],{"class":517},"buffer",[507,1612,536],{"class":521},[507,1614,539],{"class":517},[507,1616,720],{"class":521},[507,1618,1619],{"class":517}," above_ids",[507,1621,714],{"class":521},[507,1623,1624],{"class":517}," below_ids",[507,1626,1627],{"class":521},";\n",[507,1629,1630,1632,1634,1637],{"class":509,"line":576},[507,1631,688],{"class":525},[507,1633,529],{"class":521},[507,1635,1636],{"class":532},"generic_generate",[507,1638,696],{"class":521},[507,1640,1641,1643,1645,1648,1650,1653,1655,1657,1659,1662,1664,1667,1669,1672,1674,1677,1679,1681],{"class":509,"line":622},[507,1642,702],{"class":525},[507,1644,529],{"class":521},[507,1646,1647],{"class":532},"zip",[507,1649,548],{"class":521},[507,1651,1652],{"class":517},"tag_labels",[507,1654,714],{"class":521},[507,1656,1556],{"class":517},[507,1658,928],{"class":521},[507,1660,1661],{"class":517},"labels",[507,1663,555],{"class":521},[507,1665,1666],{"class":525}," std",[507,1668,529],{"class":521},[507,1670,1671],{"class":532},"tie",[507,1673,548],{"class":521},[507,1675,1676],{"class":517},"above_ids",[507,1678,714],{"class":521},[507,1680,1624],{"class":517},[507,1682,1683],{"class":521},"),\n",[507,1685,1686,1689,1691,1695,1697,1700,1703,1706,1708],{"class":509,"line":662},[507,1687,1688],{"class":521},"    [&](",[507,1690,514],{"class":513},[507,1692,1694],{"class":1693},"sHdIc"," elem",[507,1696,714],{"class":521},[507,1698,1699],{"class":513}," auto",[507,1701,1702],{"class":513}," &",[507,1704,1705],{"class":1693},"buffers",[507,1707,751],{"class":521},[507,1709,1710],{"class":521}," {\n",[507,1712,1713,1716,1718,1720,1722,1725,1727,1729,1731],{"class":509,"line":669},[507,1714,1715],{"class":513},"      auto",[507,1717,1095],{"class":521},[507,1719,944],{"class":517},[507,1721,714],{"class":521},[507,1723,1724],{"class":517}," sides",[507,1726,1111],{"class":521},[507,1728,1537],{"class":521},[507,1730,1694],{"class":517},[507,1732,1627],{"class":521},[507,1734,1735,1739,1742,1745,1748,1751,1753,1755,1758,1761],{"class":509,"line":699},[507,1736,1738],{"class":1737},"s7zQu","      if",[507,1740,1741],{"class":521}," (",[507,1743,1744],{"class":517},"tag ",[507,1746,1747],{"class":521},"!=",[507,1749,1750],{"class":532}," Index",[507,1752,548],{"class":521},[507,1754,552],{"class":551},[507,1756,1757],{"class":521},"))",[507,1759,1760],{"class":1737}," return",[507,1762,1627],{"class":521},[507,1764,1765,1767,1770,1772,1774,1777,1779],{"class":509,"line":759},[507,1766,1715],{"class":513},[507,1768,1769],{"class":517}," above ",[507,1771,522],{"class":521},[507,1773,1724],{"class":517},[507,1775,1776],{"class":521},"[",[507,1778,740],{"class":551},[507,1780,1781],{"class":521},"];\n",[507,1783,1784,1786,1789,1791,1793,1795,1797],{"class":509,"line":785},[507,1785,1715],{"class":513},[507,1787,1788],{"class":517}," below ",[507,1790,522],{"class":521},[507,1792,1724],{"class":517},[507,1794,1776],{"class":521},[507,1796,1177],{"class":551},[507,1798,1781],{"class":521},[507,1800,1801,1803,1805,1808,1811,1813,1815,1818,1821,1823,1825,1827,1829,1832,1834,1836],{"class":509,"line":835},[507,1802,1738],{"class":1737},[507,1804,1741],{"class":521},[507,1806,1807],{"class":517},"above ",[507,1809,1810],{"class":521},">=",[507,1812,1556],{"class":517},[507,1814,928],{"class":521},[507,1816,1817],{"class":517},"n_domains ",[507,1819,1820],{"class":521},"||",[507,1822,1788],{"class":517},[507,1824,1810],{"class":521},[507,1826,1556],{"class":517},[507,1828,928],{"class":521},[507,1830,1831],{"class":517},"n_domains",[507,1833,751],{"class":521},[507,1835,1760],{"class":1737},[507,1837,1627],{"class":521},[507,1839,1840,1842,1845,1848,1850,1853,1855,1857,1860],{"class":509,"line":861},[507,1841,1715],{"class":513},[507,1843,1844],{"class":521}," &[",[507,1846,1847],{"class":517},"ab",[507,1849,714],{"class":521},[507,1851,1852],{"class":517}," be",[507,1854,1111],{"class":521},[507,1856,1537],{"class":521},[507,1858,1859],{"class":517}," buffers",[507,1861,1627],{"class":521},[507,1863,1864,1866,1868,1871,1873,1876,1878,1880,1882,1885,1887,1890,1892,1895,1897,1900,1902,1905,1907,1909,1911],{"class":509,"line":910},[507,1865,1738],{"class":1737},[507,1867,1741],{"class":521},[507,1869,1870],{"class":525},"std",[507,1872,529],{"class":521},[507,1874,1875],{"class":532},"find",[507,1877,548],{"class":521},[507,1879,1847],{"class":517},[507,1881,928],{"class":521},[507,1883,1884],{"class":532},"begin",[507,1886,1272],{"class":521},[507,1888,1889],{"class":517}," ab",[507,1891,928],{"class":521},[507,1893,1894],{"class":532},"end",[507,1896,1272],{"class":521},[507,1898,1899],{"class":517}," above",[507,1901,751],{"class":521},[507,1903,1904],{"class":521}," ==",[507,1906,1889],{"class":517},[507,1908,928],{"class":521},[507,1910,1894],{"class":532},[507,1912,1913],{"class":521},"())\n",[507,1915,1916,1919,1921,1924,1926,1929],{"class":509,"line":915},[507,1917,1918],{"class":517},"        ab",[507,1920,928],{"class":521},[507,1922,1923],{"class":532},"push_back",[507,1925,548],{"class":521},[507,1927,1928],{"class":517},"above",[507,1930,1296],{"class":521},[507,1932,1933,1935,1937,1939,1941,1943,1945,1948,1950,1952,1954,1956,1958,1960,1962,1965,1967,1969,1971,1973,1975],{"class":509,"line":959},[507,1934,1738],{"class":1737},[507,1936,1741],{"class":521},[507,1938,1870],{"class":525},[507,1940,529],{"class":521},[507,1942,1875],{"class":532},[507,1944,548],{"class":521},[507,1946,1947],{"class":517},"be",[507,1949,928],{"class":521},[507,1951,1884],{"class":532},[507,1953,1272],{"class":521},[507,1955,1852],{"class":517},[507,1957,928],{"class":521},[507,1959,1894],{"class":532},[507,1961,1272],{"class":521},[507,1963,1964],{"class":517}," below",[507,1966,751],{"class":521},[507,1968,1904],{"class":521},[507,1970,1852],{"class":517},[507,1972,928],{"class":521},[507,1974,1894],{"class":532},[507,1976,1913],{"class":521},[507,1978,1979,1982,1984,1986,1988,1991],{"class":509,"line":996},[507,1980,1981],{"class":517},"        be",[507,1983,928],{"class":521},[507,1985,1923],{"class":532},[507,1987,548],{"class":521},[507,1989,1990],{"class":517},"below",[507,1992,1296],{"class":521},[507,1994,1995],{"class":509,"line":1033},[507,1996,1997],{"class":521},"    });\n",[507,1999,2000],{"class":509,"line":1038},[507,2001,666],{"emptyLinePlaceholder":665},[507,2003,2005,2007,2010,2012,2015,2017,2019,2021,2023,2025,2027,2029,2032,2034],{"class":509,"line":2004},17,[507,2006,514],{"class":513},[507,2008,2009],{"class":517}," sort_unique ",[507,2011,522],{"class":521},[507,2013,2014],{"class":521}," [](",[507,2016,688],{"class":525},[507,2018,529],{"class":521},[507,2020,1610],{"class":525},[507,2022,536],{"class":521},[507,2024,539],{"class":525},[507,2026,720],{"class":521},[507,2028,1702],{"class":513},[507,2030,2031],{"class":1693},"b",[507,2033,751],{"class":521},[507,2035,1710],{"class":521},[507,2037,2039,2042,2044,2047,2049,2051,2053,2055,2057,2060,2062,2064],{"class":509,"line":2038},18,[507,2040,2041],{"class":525},"  tbb",[507,2043,529],{"class":521},[507,2045,2046],{"class":532},"parallel_sort",[507,2048,548],{"class":521},[507,2050,2031],{"class":517},[507,2052,928],{"class":521},[507,2054,1884],{"class":532},[507,2056,1272],{"class":521},[507,2058,2059],{"class":517}," b",[507,2061,928],{"class":521},[507,2063,1894],{"class":532},[507,2065,2066],{"class":521},"());\n",[507,2068,2070,2073,2075,2078,2080,2082,2084,2087,2089,2091,2093,2095,2097,2099,2101,2103],{"class":509,"line":2069},19,[507,2071,2072],{"class":517},"  b",[507,2074,928],{"class":521},[507,2076,2077],{"class":532},"erase_till_end",[507,2079,548],{"class":521},[507,2081,1870],{"class":525},[507,2083,529],{"class":521},[507,2085,2086],{"class":532},"unique",[507,2088,548],{"class":521},[507,2090,2031],{"class":517},[507,2092,928],{"class":521},[507,2094,1884],{"class":532},[507,2096,1272],{"class":521},[507,2098,2059],{"class":517},[507,2100,928],{"class":521},[507,2102,1894],{"class":532},[507,2104,2105],{"class":521},"()));\n",[507,2107,2109],{"class":509,"line":2108},20,[507,2110,1072],{"class":521},[507,2112,2114,2117,2119,2121],{"class":509,"line":2113},21,[507,2115,2116],{"class":532},"sort_unique",[507,2118,548],{"class":521},[507,2120,1676],{"class":517},[507,2122,1296],{"class":521},[507,2124,2126,2128,2130,2133],{"class":509,"line":2125},22,[507,2127,2116],{"class":532},[507,2129,548],{"class":521},[507,2131,2132],{"class":517},"below_ids",[507,2134,1296],{"class":521},[451,2136,2137],{},"A few things worth pulling out:",[1154,2139,2140,2151,2165,2185],{},[1157,2141,2142,2147,2148,928],{},[457,2143,2144],{},[479,2145,2146],{},"tf::zip(tag_labels, dl.labels)"," walks both ranges in lockstep — no index gymnastics. Each yielded element is ",[479,2149,2150],{},"(tag, two-domain-slot)",[1157,2152,2153,2158,2159,2161,2162,2164],{},[457,2154,2155],{},[479,2156,2157],{},"tf::generic_generate"," with the multi-buffer variant runs the body in parallel using thread-local buffers, then merges into ",[479,2160,1676],{}," \u002F ",[479,2163,2132],{}," in one pass.",[1157,2166,2167,2174,2175,2177,2178,2180,2181,2184],{},[457,2168,2169,2170,2173],{},"Inner ",[479,2171,2172],{},"std::find"," dedup"," keeps each thread-local buffer small (capped at ",[479,2176,1831],{}," per side), so the post-merge ",[479,2179,2046],{}," + ",[479,2182,2183],{},"std::unique"," has almost nothing left to do.",[1157,2186,2187,1741,2190,2193],{},[457,2188,2189],{},"Sentinel skip",[479,2191,2192],{},">= dl.n_domains",") drops the knife faces that landed in the outer ring — those don't bound any real domain.",[451,2195,1578,2196,2199],{},[457,2197,2198],{},"3 above, 3 below",". The cube0-only, intersection, and cube1-only volumes each contribute one upper and one lower half.",[469,2201,2203],{"id":2202},"mapping-domain-ids-to-volume-indices","Mapping domain ids to volume indices",[451,2205,2206,2208,2209,2211],{},[479,2207,1571],{}," tells us which domain ",[479,2210,1563],{}," represents. We invert that with one parallel pass:",[499,2213,2215],{"className":501,"code":2214,"language":7,"meta":503,"style":503},"tf::buffer\u003CIndex> domain_to_idx;\ndomain_to_idx.allocate_and_initialize(\n    static_cast\u003Cstd::size_t>(dl.n_domains), Index(-1));\ntf::invert_map_with_nones(comp_labels, domain_to_idx, Index(-1));\n",[479,2216,2217,2236,2248,2279],{"__ignoreMap":503},[507,2218,2219,2221,2223,2225,2227,2229,2231,2234],{"class":509,"line":510},[507,2220,688],{"class":525},[507,2222,529],{"class":521},[507,2224,1610],{"class":517},[507,2226,536],{"class":521},[507,2228,539],{"class":517},[507,2230,720],{"class":521},[507,2232,2233],{"class":517}," domain_to_idx",[507,2235,1627],{"class":521},[507,2237,2238,2241,2243,2246],{"class":509,"line":576},[507,2239,2240],{"class":517},"domain_to_idx",[507,2242,928],{"class":521},[507,2244,2245],{"class":532},"allocate_and_initialize",[507,2247,696],{"class":521},[507,2249,2250,2253,2255,2257,2260,2262,2265,2267,2269,2271,2273,2275,2277],{"class":509,"line":622},[507,2251,2252],{"class":521},"    static_cast\u003C",[507,2254,1870],{"class":525},[507,2256,529],{"class":521},[507,2258,2259],{"class":513},"size_t",[507,2261,542],{"class":521},[507,2263,2264],{"class":517},"dl",[507,2266,928],{"class":521},[507,2268,1831],{"class":517},[507,2270,555],{"class":521},[507,2272,1750],{"class":532},[507,2274,728],{"class":521},[507,2276,1177],{"class":551},[507,2278,573],{"class":521},[507,2280,2281,2283,2285,2288,2290,2293,2295,2297,2299,2301,2303,2305],{"class":509,"line":662},[507,2282,688],{"class":525},[507,2284,529],{"class":521},[507,2286,2287],{"class":532},"invert_map_with_nones",[507,2289,548],{"class":521},[507,2291,2292],{"class":517},"comp_labels",[507,2294,714],{"class":521},[507,2296,2233],{"class":517},[507,2298,714],{"class":521},[507,2300,1750],{"class":532},[507,2302,728],{"class":521},[507,2304,1177],{"class":551},[507,2306,573],{"class":521},[451,2308,2309,2312,2313,2316,2317,2319,2320,928],{},[479,2310,2311],{},"tf::invert_map_with_nones"," writes ",[479,2314,2315],{},"domain_to_idx[comp_labels[i]] = i"," in parallel. Domain ids that don't appear in ",[479,2318,2292],{}," keep the pre-filled sentinel ",[479,2321,2322],{},"-1",[469,2324,2326],{"id":2325},"writing-volumes-and-verifying","Writing volumes and verifying",[499,2328,2330],{"className":501,"code":2329,"language":7,"meta":503,"style":503},"auto write_side = [&, &vols = volumes](const tf::buffer\u003CIndex> &ids,\n                                        const char *prefix) {\n  for (std::size_t k = 0; k \u003C ids.size(); ++k) {\n    auto v_idx = domain_to_idx[static_cast\u003Cstd::size_t>(ids[k])];\n    const auto &vol = vols[static_cast\u003Cstd::size_t>(v_idx)];\n    auto fname = std::string(prefix) + \"_\" + std::to_string(k) + \".stl\";\n    tf::write_stl(vol.polygons(), fname);\n    std::cout \u003C\u003C \"  wrote \" \u003C\u003C fname \u003C\u003C \" (faces=\" \u003C\u003C vol.faces().size()\n              \u003C\u003C \", closed=\" \u003C\u003C tf::is_closed(vol.polygons())\n              \u003C\u003C \", manifold=\" \u003C\u003C tf::is_manifold(vol.polygons()) \u003C\u003C \")\"\n              \u003C\u003C std::endl;\n  }\n};\nwrite_side(above_ids, \"above\");\nwrite_side(below_ids, \"below\");\n",[479,2331,2332,2380,2398,2447,2479,2512,2573,2598,2650,2681,2721,2734,2739,2743,2762],{"__ignoreMap":503},[507,2333,2334,2336,2339,2341,2344,2346,2349,2351,2354,2357,2360,2362,2364,2366,2368,2370,2372,2374,2377],{"class":509,"line":510},[507,2335,514],{"class":513},[507,2337,2338],{"class":517}," write_side ",[507,2340,522],{"class":521},[507,2342,2343],{"class":521}," [&,",[507,2345,1702],{"class":521},[507,2347,2348],{"class":1693},"vols",[507,2350,1537],{"class":521},[507,2352,2353],{"class":1693}," volumes",[507,2355,2356],{"class":521},"](",[507,2358,2359],{"class":513},"const",[507,2361,526],{"class":525},[507,2363,529],{"class":521},[507,2365,1610],{"class":525},[507,2367,536],{"class":521},[507,2369,539],{"class":525},[507,2371,720],{"class":521},[507,2373,1702],{"class":513},[507,2375,2376],{"class":1693},"ids",[507,2378,2379],{"class":521},",\n",[507,2381,2382,2385,2388,2391,2394,2396],{"class":509,"line":576},[507,2383,2384],{"class":513},"                                        const",[507,2386,2387],{"class":513}," char",[507,2389,2390],{"class":513}," *",[507,2392,2393],{"class":1693},"prefix",[507,2395,751],{"class":521},[507,2397,1710],{"class":521},[507,2399,2400,2403,2405,2407,2409,2411,2414,2416,2419,2422,2424,2426,2429,2431,2434,2437,2440,2443,2445],{"class":509,"line":622},[507,2401,2402],{"class":1737},"  for",[507,2404,1741],{"class":521},[507,2406,1870],{"class":525},[507,2408,529],{"class":521},[507,2410,2259],{"class":513},[507,2412,2413],{"class":517}," k ",[507,2415,522],{"class":521},[507,2417,2418],{"class":551}," 0",[507,2420,2421],{"class":521},";",[507,2423,2413],{"class":517},[507,2425,536],{"class":521},[507,2427,2428],{"class":517}," ids",[507,2430,928],{"class":521},[507,2432,2433],{"class":532},"size",[507,2435,2436],{"class":521},"();",[507,2438,2439],{"class":521}," ++",[507,2441,2442],{"class":517},"k",[507,2444,751],{"class":521},[507,2446,1710],{"class":521},[507,2448,2449,2452,2455,2457,2459,2462,2464,2466,2468,2470,2472,2474,2476],{"class":509,"line":662},[507,2450,2451],{"class":513},"    auto",[507,2453,2454],{"class":1059}," v_idx ",[507,2456,522],{"class":521},[507,2458,2233],{"class":517},[507,2460,2461],{"class":521},"[static_cast\u003C",[507,2463,1870],{"class":525},[507,2465,529],{"class":521},[507,2467,2259],{"class":513},[507,2469,542],{"class":521},[507,2471,2376],{"class":517},[507,2473,1776],{"class":521},[507,2475,2442],{"class":1059},[507,2477,2478],{"class":521},"])];\n",[507,2480,2481,2484,2486,2488,2491,2493,2496,2498,2500,2502,2504,2506,2509],{"class":509,"line":669},[507,2482,2483],{"class":513},"    const",[507,2485,1699],{"class":513},[507,2487,1702],{"class":521},[507,2489,2490],{"class":1059},"vol ",[507,2492,522],{"class":521},[507,2494,2495],{"class":517}," vols",[507,2497,2461],{"class":521},[507,2499,1870],{"class":525},[507,2501,529],{"class":521},[507,2503,2259],{"class":513},[507,2505,542],{"class":521},[507,2507,2508],{"class":1059},"v_idx",[507,2510,2511],{"class":521},")];\n",[507,2513,2514,2516,2519,2521,2523,2525,2528,2530,2532,2534,2537,2540,2544,2547,2549,2551,2553,2556,2558,2560,2562,2564,2566,2569,2571],{"class":509,"line":699},[507,2515,2451],{"class":513},[507,2517,2518],{"class":1059}," fname ",[507,2520,522],{"class":521},[507,2522,1666],{"class":525},[507,2524,529],{"class":521},[507,2526,2527],{"class":532},"string",[507,2529,548],{"class":521},[507,2531,2393],{"class":1059},[507,2533,751],{"class":521},[507,2535,2536],{"class":521}," +",[507,2538,2539],{"class":521}," \"",[507,2541,2543],{"class":2542},"sfazB","_",[507,2545,2546],{"class":521},"\"",[507,2548,2536],{"class":521},[507,2550,1666],{"class":525},[507,2552,529],{"class":521},[507,2554,2555],{"class":532},"to_string",[507,2557,548],{"class":521},[507,2559,2442],{"class":1059},[507,2561,751],{"class":521},[507,2563,2536],{"class":521},[507,2565,2539],{"class":521},[507,2567,2568],{"class":2542},".stl",[507,2570,2546],{"class":521},[507,2572,1627],{"class":521},[507,2574,2575,2577,2579,2582,2584,2587,2589,2591,2593,2596],{"class":509,"line":759},[507,2576,702],{"class":525},[507,2578,529],{"class":521},[507,2580,2581],{"class":532},"write_stl",[507,2583,548],{"class":521},[507,2585,2586],{"class":517},"vol",[507,2588,928],{"class":521},[507,2590,931],{"class":532},[507,2592,1272],{"class":521},[507,2594,2595],{"class":1059}," fname",[507,2597,1296],{"class":521},[507,2599,2600,2603,2605,2608,2611,2613,2616,2618,2621,2623,2625,2627,2630,2632,2634,2637,2639,2642,2645,2647],{"class":509,"line":785},[507,2601,2602],{"class":525},"    std",[507,2604,529],{"class":521},[507,2606,2607],{"class":1059},"cout ",[507,2609,2610],{"class":521},"\u003C\u003C",[507,2612,2539],{"class":521},[507,2614,2615],{"class":2542},"  wrote ",[507,2617,2546],{"class":521},[507,2619,2620],{"class":521}," \u003C\u003C",[507,2622,2518],{"class":1059},[507,2624,2610],{"class":521},[507,2626,2539],{"class":521},[507,2628,2629],{"class":2542}," (faces=",[507,2631,2546],{"class":521},[507,2633,2620],{"class":521},[507,2635,2636],{"class":517}," vol",[507,2638,928],{"class":521},[507,2640,2641],{"class":532},"faces",[507,2643,2644],{"class":521},"().",[507,2646,2433],{"class":532},[507,2648,2649],{"class":521},"()\n",[507,2651,2652,2655,2657,2660,2662,2664,2666,2668,2671,2673,2675,2677,2679],{"class":509,"line":835},[507,2653,2654],{"class":521},"              \u003C\u003C",[507,2656,2539],{"class":521},[507,2658,2659],{"class":2542},", closed=",[507,2661,2546],{"class":521},[507,2663,2620],{"class":521},[507,2665,526],{"class":525},[507,2667,529],{"class":521},[507,2669,2670],{"class":532},"is_closed",[507,2672,548],{"class":521},[507,2674,2586],{"class":517},[507,2676,928],{"class":521},[507,2678,931],{"class":532},[507,2680,1913],{"class":521},[507,2682,2683,2685,2687,2690,2692,2694,2696,2698,2701,2703,2705,2707,2709,2712,2714,2716,2718],{"class":509,"line":861},[507,2684,2654],{"class":521},[507,2686,2539],{"class":521},[507,2688,2689],{"class":2542},", manifold=",[507,2691,2546],{"class":521},[507,2693,2620],{"class":521},[507,2695,526],{"class":525},[507,2697,529],{"class":521},[507,2699,2700],{"class":532},"is_manifold",[507,2702,548],{"class":521},[507,2704,2586],{"class":517},[507,2706,928],{"class":521},[507,2708,931],{"class":532},[507,2710,2711],{"class":521},"())",[507,2713,2620],{"class":521},[507,2715,2539],{"class":521},[507,2717,751],{"class":2542},[507,2719,2720],{"class":521},"\"\n",[507,2722,2723,2725,2727,2729,2732],{"class":509,"line":910},[507,2724,2654],{"class":521},[507,2726,1666],{"class":525},[507,2728,529],{"class":521},[507,2730,2731],{"class":1059},"endl",[507,2733,1627],{"class":521},[507,2735,2736],{"class":509,"line":915},[507,2737,2738],{"class":521},"  }\n",[507,2740,2741],{"class":509,"line":959},[507,2742,1072],{"class":521},[507,2744,2745,2748,2750,2752,2754,2756,2758,2760],{"class":509,"line":996},[507,2746,2747],{"class":532},"write_side",[507,2749,548],{"class":521},[507,2751,1676],{"class":517},[507,2753,714],{"class":521},[507,2755,2539],{"class":521},[507,2757,1928],{"class":2542},[507,2759,2546],{"class":521},[507,2761,1296],{"class":521},[507,2763,2764,2766,2768,2770,2772,2774,2776,2778],{"class":509,"line":1033},[507,2765,2747],{"class":532},[507,2767,548],{"class":521},[507,2769,2132],{"class":517},[507,2771,714],{"class":521},[507,2773,2539],{"class":521},[507,2775,1990],{"class":2542},[507,2777,2546],{"class":521},[507,2779,1296],{"class":521},[451,2781,2782,2785,2786,2789,2790,2793,2794,2796],{},[479,2783,2784],{},"tf::is_closed"," checks that every edge is shared by exactly two faces (no boundary), and ",[479,2787,2788],{},"tf::is_manifold"," checks that no edge is shared by three or more. Every output volume should print ",[479,2791,2792],{},"closed=1, manifold=1"," — the structural guarantee ",[479,2795,489],{}," makes is verified at the boundary.",[451,2798,2799],{},"Running the example writes six STL files and prints:",[499,2801,2806],{"className":2802,"code":2804,"language":2805,"meta":503},[2803],"language-text","=== Arrangement ===\nFaces:  176\nPoints: 48\n\n=== Cleaned ===\nFaces:  114\nPoints: 40\n\n=== Domain labels ===\nBounded domains: 6\nVolumes extracted: 6\n\n=== Signed side of the knife ===\nAbove (+normal): 3 volumes\nBelow (-normal): 3 volumes\n  wrote above_0.stl (faces=22, closed=1, manifold=1)\n  wrote above_1.stl (faces=24, closed=1, manifold=1)\n  wrote above_2.stl (faces=22, closed=1, manifold=1)\n  wrote below_0.stl (faces=24, closed=1, manifold=1)\n  wrote below_1.stl (faces=22, closed=1, manifold=1)\n  wrote below_2.stl (faces=22, closed=1, manifold=1)\n","text",[479,2807,2804],{"__ignoreMap":503},[451,2809,2810],{},"The 24-face volumes are the intersection halves — they pick up parts of both cubes' inner walls, so their boundary surface is slightly larger than the cube-only halves.",[469,2812,2814],{"id":2813},"summary","Summary",[1431,2816,2817,2830],{},[1434,2818,2819],{},[1437,2820,2821,2824,2827],{},[1440,2822,2823],{},"Step",[1440,2825,2826],{},"API",[1440,2828,2829],{},"What you get",[1447,2831,2832,2850,2862,2875,2888,2901,2915],{},[1437,2833,2834,2837,2842],{},[1452,2835,2836],{},"Build arrangement",[1452,2838,2839],{},[479,2840,2841],{},"tf::make_mesh_arrangements",[1452,2843,2844,2845,2180,2847],{},"One merged mesh + ",[479,2846,1652],{},[479,2848,2849],{},"face_labels",[1437,2851,2852,2854,2859],{},[1452,2853,77],{},[1452,2855,2856],{},[479,2857,2858],{},"tf::cleaned(..., tf::return_index_map)",[1452,2860,2861],{},"Cleaned mesh + face\u002Fpoint index maps",[1437,2863,2864,2867,2872],{},[1452,2865,2866],{},"Reindex attributes",[1452,2868,2869],{},[479,2870,2871],{},"tf::reindexed(range, face_im)",[1452,2873,2874],{},"Per-face attributes aligned to cleaned mesh",[1437,2876,2877,2880,2885],{},[1452,2878,2879],{},"Label domains",[1452,2881,2882],{},[479,2883,2884],{},"tf::make_domain_labels(polygons, flags)",[1452,2886,2887],{},"Per-face two-slot domain ids",[1437,2889,2890,2893,2898],{},[1452,2891,2892],{},"Extract volumes",[1452,2894,2895],{},[479,2896,2897],{},"tf::split_into_domains",[1452,2899,2900],{},"Closed, manifold, outward-oriented submeshes",[1437,2902,2903,2906,2912],{},[1452,2904,2905],{},"Side selection",[1452,2907,2908,2911],{},[479,2909,2910],{},"dl.labels[f][0\u002F1]"," per knife face",[1452,2913,2914],{},"Domain ids on each signed side",[1437,2916,2917,2920,2926],{},[1452,2918,2919],{},"Verify",[1452,2921,2922,2161,2924],{},[479,2923,2784],{},[479,2925,2788],{},[1452,2927,2928],{},"Structural sanity per output",[1349,2930,2931],{"icon":1351},[451,2932,2933,2934,2936,2937,1174,2939,1174,2941,2943,2944,2936,2946,2948,2949,2943,2951,2936,2953,928],{},"See ",[462,2935,47],{"href":48}," for ",[479,2938,485],{},[479,2940,2670],{},[479,2942,2700],{},"; ",[462,2945,82],{"href":83},[479,2947,489],{}," and ",[479,2950,2287],{},[462,2952,67],{"href":68},[479,2954,1123],{},[2956,2957,2958],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .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 .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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":503,"searchDepth":510,"depth":576,"links":2960},[2961,2962,2963,2964,2965,2966,2967,2968,2969,2970],{"id":471,"depth":576,"text":472},{"id":493,"depth":576,"text":494},{"id":1082,"depth":576,"text":1083},{"id":1197,"depth":576,"text":1198},{"id":1361,"depth":576,"text":1362},{"id":1512,"depth":576,"text":1513},{"id":1584,"depth":576,"text":1585},{"id":2202,"depth":576,"text":2203},{"id":2325,"depth":576,"text":2326},{"id":2813,"depth":576,"text":2814},"Building an arrangement from intersecting meshes, extracting closed bounded volumes, and selecting them by signed side of a knife.","md",null,{},{"icon":163},{"title":160,"description":2971},"iVFdp-pmCxBABlg-T94gx6fGspwUmUc7TdoYXL96MC8",[2979,2981],{"title":155,"path":156,"stem":157,"description":2980,"icon":158,"children":-1},"Aligning point clouds with and without correspondences.",{"title":165,"path":166,"stem":167,"description":2982,"icon":125,"children":-1},"Using trueform with VTK applications.",1780947774381]