1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- 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)
|