The 3D version drags a duct and a pipe through one structural bay and reports the clash state of that single configuration. This 2D companion instead renders the entire routing search space at once: the horizontal axis is every possible HVAC duct height, the vertical axis every possible plumbing pipe height, and each point is colored by running the identical axis-aligned bounding-box (AABB) scan at that (duct, pipe) pair:
box = { min: (x0,y0,z0), max: (x1,y1,z1) }
gap on one axis:
g = max(minA - maxB, minB - maxA, 0)
3D clearance distance:
d = sqrt(gxΒ² + gyΒ² + gzΒ²)
d = 0 β hard clash (volumes penetrate)
d < tolerance β soft clash (clearance violation)
d β₯ tolerance β clear
Because the structural beams and the duct/pipe runs only ever move vertically, the horizontal (x) and depth (z) gaps between them are always zero β the whole clash map collapses to two flat "clash bands" (one per system, where its height lands inside the beam's vertical envelope) plus a diagonal band along duct-height β pipe-height, where the two services cross each other directly. That diagonal is not drawn in β it falls straight out of the same boxGap() formula used above, applied to the HVAC-vs-pipe pair.
AI Auto-Resolve runs the same brute-force grid search as the 3D version β sweep every (duct, pipe) height pair, re-score each with the AABB scan, keep the one that zeroes the clash count while maximizing minimum clearance β except here you watch the search marker glide across the map you can already see, instead of trusting an opaque jump to the answer.
- Click or drag anywhere on the map β sets the duct/pipe height directly, same as the sliders.
- Clearance tolerance β widens both clash bands and the diagonal crossing band live as you drag it.
- Color scale β red intensity encodes penetration depth (worse = brighter), green intensity encodes clearance margin (more clearance = brighter).