**算法实现细节:**
1. **空间索引 (QuadTree):**
如果数据量更大(上千),我会上四叉树。但 200 个点,直接遍历 `OccupiedList` 性能足够 (<1ms)。
2. **包围盒检测 (AABB):**
判断两个矩形是否相交:
`!(r2.left > r1.right || r2.right < r1.left || r2.top > r1.bottom || r2.bottom < r1.top)`
3. **退火策略 (Simulated Annealing):**
为了让布局更自然,不仅仅是不重叠。我引入了一个"能量函数",重叠是高能量。
通过迭代移动 label 位置来降低总能量。
但在前端渲染循环(rAF)中,为了性能,我简化为:
- 预计算:根据坐标生成初始位置。
- 检测:与已绘制的 Boxes 检测。
- 修正:有冲突?尝试 4 个方向偏移 10px。
- 降级:还是冲突?opacity = 0,仅显示点。