双移线路径python代码
时间: 2023-10-13 11:19:28 浏览: 91
以下是双移线路径的Python代码,其中以点集列表的形式输入起点和终点,并输出路径的点集:
```python
import math
def get_distance(p, q):
"""计算两点之间的距离"""
return math.sqrt((p[0]-q[0])**2 + (p[1]-q[1])**2)
def get_angle(p, q):
"""计算两点之间的夹角"""
angle = math.atan2(q[1]-p[1], q[0]-p[0])
return angle if angle>=0 else angle+2*math.pi
def get_perpendicular(p, q, d):
"""计算垂线上的点"""
angle = get_angle(p, q)
return (q[0] + d*math.sin(angle), q[1] - d*math.cos(angle))
def get_bisector(p, q, r, s, d):
"""计算平分线上的交点"""
p1 = get_perpendicular(p, q, d)
p2 = get_perpendicular(r, s, d)
m1 = (p[1]-q[1])/(p[0]-q[0])
m2 = (r[1]-s[1])/(r[0]-s[0])
x = (m1*p[0]-m2*r[0]-p1[1]+p2[1])/(m1-m2)
y = m1*(x-p[0])+p1[1]
return (x, y)
def get_offset_curve(points, d):
"""计算偏移曲线"""
n = len(points)
res = []
for i in range(1, n):
p = points[i-1]
q = points[i]
r = q if i==n-1 else points[i+1]
angle1 = get_angle(p, q)
angle2 = get_angle(q, r)
bisector_angle = (angle1+angle2)/2 if angle1<angle2 else (angle1+angle2)/2 + math.pi
bisector_point = (q[0]+d*math.sin(bisector_angle), q[1]-d*math.cos(bisector_angle))
if i==1:
res.append(get_perpendicular(p, q, d))
res.append(get_bisector(p, q, q, bisector_point, d))
if i==n-1:
res.append(get_perpendicular(q, r, d))
return res
def get_double_offset_curve(points, d1, d2):
"""计算双移线曲线"""
offset_curve1 = get_offset_curve(points, d1)
offset_curve2 = get_offset_curve(points, d2)
offset_curve2.reverse()
return offset_curve1 + offset_curve2
# 测试
points = [(0, 0), (0, 3), (3, 6), (6, 0), (9, 3), (9, 6), (6, 9), (3, 3), (0, 6)]
double_offset_curve = get_double_offset_curve(points, 1, -1)
print(double_offset_curve)
```
其中,`get_distance`、`get_angle` 和 `get_perpendicular` 分别用于计算两点之间的距离、夹角和垂线上的点。`get_bisector` 用于计算平分线上的点。`get_offset_curve` 用于计算偏移曲线,`get_double_offset_curve` 用于计算双移线曲线。测试代码给出了一个多边形的点集,并计算了其内部和外部的双移线曲线上的点集。
阅读全文