import numpy as np def find_offset_points(x1, y1, x2, y2, distance=5): # 计算线段上五分之一处的点 x_p = x1 + (x2 - x1) / 5 y_p = y1 + (y2 - y1) / 5 # 计算线段的斜率 m = (y2 - y1) / (x2 - x1) # 计算法线的斜率 m_perp = -1 / m if m != 0 else np.inf # 防止除以零 # 如果斜率为无穷大,则法线为垂直线 if np.isinf(m_perp): x_offset = x_p y_offset_1 = y_p + distance y_offset_2 = y_p - distance return [(x_offset, y_offset_1), (x_offset, y_offset_2)] # 法线方程 y - y_p = m_perp(x - x_p) # 改写为标准形式 m_perp*x - y + y_p - m_perp*x_p = 0 A = m_perp B = -1 C = y_p - m_perp * x_p # 平行线方程 Ax + By + C_offset = 0 # 距离公式 d = |Ax + By + C| / sqrt(A^2 + B^2) = distance # |Ax + By + C_offset| = distance * sqrt(A^2 + B^2) # C_offset = C +/- distance * sqrt(A^2 + B^2) sqrt_AB = np.sqrt(A ** 2 + B ** 2) C_offset_1 = C + distance * sqrt_AB C_offset_2 = C - distance * sqrt_AB # 解方程找到平行线上的点 # m_perp*x - y + C_offset = 0 => y = m_perp*x + C_offset def solve_for_y(x, C_offset): return m_perp * x + C_offset # 选择线段AB上的一个点进行代入求解,比如选择x1或x2 # 这里选择x1,也可以选择x2 x_test = x1 # 或者 x_test = x2 y1_offset = solve_for_y(x_test, C_offset_1) y2_offset = solve_for_y(x_test, C_offset_2) # 计算对应的x坐标 x1_offset = (y1_offset - C_offset_1) / m_perp x2_offset = (y2_offset - C_offset_2) / m_perp # 返回两个坐标点 return [(x1_offset, y1_offset), (x2_offset, y2_offset)] # 示例使用 x1, y1 = 0, 0 x2, y2 = 10, 10 points = find_offset_points(x1, y1, x2, y2) print(points)