| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- # 测试 Liang-Barsky 算法计算重叠长度
- bbox = [-3.41, -2.0, -3.17, -0.7] # [x0, y0, x1, y1]
- # seg[28]: (-3.33,-0.18)->(-3.33,-1.40)
- va = (-3.33, -0.18)
- vb = (-3.33, -1.40)
- dx, dy = vb[0] - va[0], vb[1] - va[1]
- seg_len = (dx*dx + dy*dy) ** 0.5
- bx0, by0 = bbox[0], bbox[1] # -3.41, -2.0
- bx1, by1 = bbox[2], bbox[3] # -3.17, -0.7
- print(f'seg[28]: {va}->{vb}, len={seg_len:.3f}')
- print(f'bbox: [{bx0}, {by0}, {bx1}, {by1}]')
- t_start = 0.0
- t_end = 1.0
- # 与 bbox 左右边界的交点 (dx=0, 跳过)
- print(f'dx={dx}, 跳过左右边界')
- # 与 bbox 上下边界的交点
- if abs(dy) > 1e-8:
- t_bottom = (by0 - va[1]) / dy
- t_top = (by1 - va[1]) / dy
- print(f't_bottom={t_bottom:.4f}, t_top={t_top:.4f}')
- if dy > 0:
- t_start = max(t_start, min(t_bottom, t_top))
- t_end = min(t_end, max(t_bottom, t_top))
- else:
- t_start = max(t_start, min(t_top, t_bottom))
- t_end = min(t_end, max(t_top, t_bottom))
- print(f'After y-clip: t_start={t_start:.4f}, t_end={t_end:.4f}')
- if t_end > t_start:
- overlap = (t_end - t_start) * seg_len
- print(f'overlap = ({t_end:.4f} - {t_start:.4f}) * {seg_len:.3f} = {overlap:.3f}')
- else:
- overlap = 0
- print(f'overlap = 0 (t_end <= t_start)')
- print()
- # seg[29]: (-3.33,-1.08)->(-3.33,-2.02)
- va = (-3.33, -1.08)
- vb = (-3.33, -2.02)
- dx, dy = vb[0] - va[0], vb[1] - va[1]
- seg_len = (dx*dx + dy*dy) ** 0.5
- print(f'seg[29]: {va}->{vb}, len={seg_len:.3f}')
- t_start = 0.0
- t_end = 1.0
- if abs(dy) > 1e-8:
- t_bottom = (by0 - va[1]) / dy
- t_top = (by1 - va[1]) / dy
- print(f't_bottom={t_bottom:.4f}, t_top={t_top:.4f}')
- if dy > 0:
- t_start = max(t_start, min(t_bottom, t_top))
- t_end = min(t_end, max(t_bottom, t_top))
- else:
- t_start = max(t_start, min(t_top, t_bottom))
- t_end = min(t_end, max(t_top, t_bottom))
- print(f'After y-clip: t_start={t_start:.4f}, t_end={t_end:.4f}')
- if t_end > t_start:
- overlap = (t_end - t_start) * seg_len
- print(f'overlap = ({t_end:.4f} - {t_start:.4f}) * {seg_len:.3f} = {overlap:.3f}')
- else:
- overlap = 0
- print(f'overlap = 0 (t_end <= t_start)')
|