test_overlap2.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. # 测试 Liang-Barsky 算法计算重叠长度
  2. bbox = [-3.41, -2.0, -3.17, -0.7] # [x0, y0, x1, y1]
  3. # seg[28]: (-3.33,-0.18)->(-3.33,-1.40)
  4. va = (-3.33, -0.18)
  5. vb = (-3.33, -1.40)
  6. dx, dy = vb[0] - va[0], vb[1] - va[1]
  7. seg_len = (dx*dx + dy*dy) ** 0.5
  8. bx0, by0 = bbox[0], bbox[1] # -3.41, -2.0
  9. bx1, by1 = bbox[2], bbox[3] # -3.17, -0.7
  10. print(f'seg[28]: {va}->{vb}, len={seg_len:.3f}')
  11. print(f'bbox: [{bx0}, {by0}, {bx1}, {by1}]')
  12. t_start = 0.0
  13. t_end = 1.0
  14. # 与 bbox 左右边界的交点 (dx=0, 跳过)
  15. print(f'dx={dx}, 跳过左右边界')
  16. # 与 bbox 上下边界的交点
  17. if abs(dy) > 1e-8:
  18. t_bottom = (by0 - va[1]) / dy
  19. t_top = (by1 - va[1]) / dy
  20. print(f't_bottom={t_bottom:.4f}, t_top={t_top:.4f}')
  21. if dy > 0:
  22. t_start = max(t_start, min(t_bottom, t_top))
  23. t_end = min(t_end, max(t_bottom, t_top))
  24. else:
  25. t_start = max(t_start, min(t_top, t_bottom))
  26. t_end = min(t_end, max(t_top, t_bottom))
  27. print(f'After y-clip: t_start={t_start:.4f}, t_end={t_end:.4f}')
  28. if t_end > t_start:
  29. overlap = (t_end - t_start) * seg_len
  30. print(f'overlap = ({t_end:.4f} - {t_start:.4f}) * {seg_len:.3f} = {overlap:.3f}')
  31. else:
  32. overlap = 0
  33. print(f'overlap = 0 (t_end <= t_start)')
  34. print()
  35. # seg[29]: (-3.33,-1.08)->(-3.33,-2.02)
  36. va = (-3.33, -1.08)
  37. vb = (-3.33, -2.02)
  38. dx, dy = vb[0] - va[0], vb[1] - va[1]
  39. seg_len = (dx*dx + dy*dy) ** 0.5
  40. print(f'seg[29]: {va}->{vb}, len={seg_len:.3f}')
  41. t_start = 0.0
  42. t_end = 1.0
  43. if abs(dy) > 1e-8:
  44. t_bottom = (by0 - va[1]) / dy
  45. t_top = (by1 - va[1]) / dy
  46. print(f't_bottom={t_bottom:.4f}, t_top={t_top:.4f}')
  47. if dy > 0:
  48. t_start = max(t_start, min(t_bottom, t_top))
  49. t_end = min(t_end, max(t_bottom, t_top))
  50. else:
  51. t_start = max(t_start, min(t_top, t_bottom))
  52. t_end = min(t_end, max(t_top, t_bottom))
  53. print(f'After y-clip: t_start={t_start:.4f}, t_end={t_end:.4f}')
  54. if t_end > t_start:
  55. overlap = (t_end - t_start) * seg_len
  56. print(f'overlap = ({t_end:.4f} - {t_start:.4f}) * {seg_len:.3f} = {overlap:.3f}')
  57. else:
  58. overlap = 0
  59. print(f'overlap = 0 (t_end <= t_start)')