123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- import sys
- # 从文件读取一组节点
- nodes = []
- with open(r"C:\TSP\CDR_TO_TSP", "r") as file:
- nodes = file.readlines()
- # 删除第一个元素(源数据总数)
- nodes = nodes[1:]
- # 删除最后一个元素 换行(\n)
- nodes = nodes[:-1]
- # 定义一个函数来对节点进行排序和删除重复
- def sort_and_remove_duplicates(nodes):
- sorted_nodes = sorted(nodes) # 按照默认的元素顺序排序
- unique_nodes = [sorted_nodes[0]] # 保留第一个元素
- for node in sorted_nodes[1:]:
- # 如果当前节点与前一个节点不相同,则将其添加到列表中
- if node != unique_nodes[-1]:
- unique_nodes.append(node)
- return unique_nodes
- # 对节点进行排序和删除重复,写回文件
- unique_nodes = sort_and_remove_duplicates(nodes)
- total = len(unique_nodes)
- points = []
- for i in range(total):
- pot = unique_nodes[i].split()
- node = float(pot[0]), float(pot[1])
- points.append(node)
- # print(points)
- # boundary 是一个四元组,表示这组点的边界
- x_min = min(point[0] for point in points)
- x_max = max(point[0] for point in points)
- y_min = min(point[1] for point in points)
- y_max = max(point[1] for point in points)
- boundary = (x_min, x_max, y_min, y_max)
- print(boundary)
- # near_boundary_points将会是一个列表,包含所有距离边界不超过1的点
- near_boundary_points = []
- for point in points:
- if (
- abs(point[0] - x_min) <= 1
- or abs(point[0] - x_max) <= 1
- or abs(point[1] - y_min) <= 1
- or abs(point[1] - y_max) <= 1
- ):
- near_boundary_points.append(point)
- # print(near_boundary_points)
- tuples_list = near_boundary_points
- # 对元组列表分别按第二个元素进行升序排序 再第一个元素进行升序排序
- sorted_tuples = sorted(tuples_list, key=lambda x: x[1])
- near_boundary_points = sorted(sorted_tuples, key=lambda x: x[0])
- # 输出排序后的元组列表
- # print(near_boundary_points)
- # 移除相邻点
- def remove_adjacent(nodes):
- threshold = 0.5 # 设定阈值
- for i, node in enumerate(nodes):
- remove_indices = []
- for j, other_node in enumerate(nodes[i+1:]):
- distance = ((node[0]-other_node[0])**2 + (node[1]-other_node[1])**2)**0.5
- if distance < threshold:
- remove_indices.append(i+j+1) # 记录需要移除的点的索引
- for index in sorted(remove_indices, reverse=True):
- del nodes[index] # 移除邻近的点
- return nodes
- near_boundary_points = remove_adjacent(near_boundary_points)
- # 统计 x_min和y_max邻近的坐标点个数, 也就是求边界框左边 节点个数
- left_points = []
- top_points = []
- for x, y in near_boundary_points:
- if abs(x - x_min) <= 0.5:
- left_points.append((x, y))
- if abs(y - y_max) <= 0.5:
- top_points.append((x, y))
- left_points.reverse()
- print(left_points)
- if len(left_points) % 2 :
- top_points.reverse() # 控制竖线从右往左
- print(top_points)
- # 把裁切线节点 写文件 TSP2.tx ,完成算法
- total = len(left_points) + len(top_points)
- f = open(r"C:\TSP\TSP2.txt", "w")
- line = "%d %d\n" % (total, total)
- f.write(line)
- ext = 3 # extend 延长线, 默认值 3mm
- if len(sys.argv) > 1:
- ext = float(sys.argv[1])
-
- inverter = 1 # 交流频率控制
- for x, y in left_points:
- if inverter == 1:
- line = "%f %f %f %f\n" % (x - ext, y, x_max + ext, y)
- else:
- line = "%f %f %f %f\n" % (x_max + ext, y, x - ext, y)
- f.write(line)
- inverter = (inverter + 1) % 2
- for x, y in top_points:
- if inverter == len(left_points) % 2: # 控制竖线从下面往上
- line = "%f %f %f %f\n" % (x, y + ext, x, y_min - ext)
- else:
- line = "%f %f %f %f\n" % (x, y_min - ext, x, y + ext)
- f.write(line)
- inverter = (inverter + 1) % 2
|