异形场地排布系统:技术难点
本报告仅聚焦于系统在纯前端(HTML/CSS/JS)且无第三方物理引擎依赖下,实现高精度排布的核心技术挑战与解决路径。
非正交异形边界的碰撞检测
- 技术痛点: 传统的前端拖拽常采用轴对齐包围盒(AABB)算法,该算法仅适用于规则矩形场地。面对包含折线、缺角的异形多边形红线时,AABB 会导致大面积的误判阻挡。
- 解决路径: 废弃 AABB,引入多边形射线投射算法(Ray Casting)。将场地红线降维为二维顶点阵列,通过计算虚拟射线与多边形边界交点的奇偶性,精准判定体块顶点是否越界。
任意角度旋转的物理坐标映射
- 技术痛点: 前端原生的 CSS
transform: rotate仅能改变元素的视觉渲染,其底层物理 DOM 边界块依然是水平的,导致旋转后碰撞检测失效。 - 解决路径: 构建方向包围盒(OBB)代数模型。利用三角函数(正弦/余弦旋转矩阵),在每次旋转或拖拽时,实时解算体块倾斜后四个顶点的绝对屏幕坐标,再将其送入射线检测池。
圆形体块的“空气墙”效应
- 技术痛点: 在正交坐标系下,圆形体块的物理边界默认被简化为其外接正方形。这导致圆形在逼近场地锐角或边界时,其隐形的“方角”会提前触发碰撞,产生视觉上未触碰却无法拖动的“空气墙”。
- 解决路径: 实施动态降维拟合。在圆形体块处于拖拽状态时,算法动态将其圆弧边界按 45 度角离散拟合为“正八边形”顶点矩阵进行检测,以此消除视觉圆弧与物理方框间的公差,实现完美贴边。
严苛空间度量与前端盒模型的冲突
- 技术痛点: 建筑排布对尺寸要求极度严苛。例如 66 米的边界理论上恰好容纳 3 个 20 米的体块。但浏览器默认盒模型下,边框厚度(Border)会向外扩张,导致 3 个体块实际总宽超过 60 米,触发碰撞拦截。
- 解决路径: 强制底层样式阻断。全局注入
box-sizing: border-box,将边框与内边距的计算强制内收,确保体块的外部绝对物理尺寸严格锁定在用户输入的参数值内。
画布涂鸦与体块拖拽的 Z 轴事件拦截
- 技术痛点: 为实现自由涂鸦,必须在顶层覆盖全屏
<canvas>。但这会拦截所有底层的鼠标/触摸事件,导致下方 DOM 体块无法被选中和拖拽。 - 解决路径: 引入状态机与事件穿透(Pointer Events)隔离。建立排布/涂鸦双态开关。排布模式下,动态赋予画布
pointer-events: none使其物理穿透;涂鸦模式下则锁定底层交互。以此在同一坐标系内实现零冲突的多模态交互。