test.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import numpy as np
  2. def find_offset_points(x1, y1, x2, y2, distance=5):
  3. # 计算线段上五分之一处的点
  4. x_p = x1 + (x2 - x1) / 5
  5. y_p = y1 + (y2 - y1) / 5
  6. # 计算线段的斜率
  7. m = (y2 - y1) / (x2 - x1)
  8. # 计算法线的斜率
  9. m_perp = -1 / m if m != 0 else np.inf # 防止除以零
  10. # 如果斜率为无穷大,则法线为垂直线
  11. if np.isinf(m_perp):
  12. x_offset = x_p
  13. y_offset_1 = y_p + distance
  14. y_offset_2 = y_p - distance
  15. return [(x_offset, y_offset_1), (x_offset, y_offset_2)]
  16. # 法线方程 y - y_p = m_perp(x - x_p)
  17. # 改写为标准形式 m_perp*x - y + y_p - m_perp*x_p = 0
  18. A = m_perp
  19. B = -1
  20. C = y_p - m_perp * x_p
  21. # 平行线方程 Ax + By + C_offset = 0
  22. # 距离公式 d = |Ax + By + C| / sqrt(A^2 + B^2) = distance
  23. # |Ax + By + C_offset| = distance * sqrt(A^2 + B^2)
  24. # C_offset = C +/- distance * sqrt(A^2 + B^2)
  25. sqrt_AB = np.sqrt(A ** 2 + B ** 2)
  26. C_offset_1 = C + distance * sqrt_AB
  27. C_offset_2 = C - distance * sqrt_AB
  28. # 解方程找到平行线上的点
  29. # m_perp*x - y + C_offset = 0 => y = m_perp*x + C_offset
  30. def solve_for_y(x, C_offset):
  31. return m_perp * x + C_offset
  32. # 选择线段AB上的一个点进行代入求解,比如选择x1或x2
  33. # 这里选择x1,也可以选择x2
  34. x_test = x1 # 或者 x_test = x2
  35. y1_offset = solve_for_y(x_test, C_offset_1)
  36. y2_offset = solve_for_y(x_test, C_offset_2)
  37. # 计算对应的x坐标
  38. x1_offset = (y1_offset - C_offset_1) / m_perp
  39. x2_offset = (y2_offset - C_offset_2) / m_perp
  40. # 返回两个坐标点
  41. return [(x1_offset, y1_offset), (x2_offset, y2_offset)]
  42. # 示例使用
  43. x1, y1 = 0, 0
  44. x2, y2 = 10, 10
  45. points = find_offset_points(x1, y1, x2, y2)
  46. print(points)