如何实现正确计算各点到其余点线段角度及长度的Python函数?
实现正确的向量计算函数
需求说明
实现一个函数,按距离原点(0,0)由近到远的顺序遍历每个点作为原点,计算该点到其他所有点的线段的角度和长度,同时跳过已经计算过的重复线段(即A到B和B到A视为同一段,只计算一次)。
现有问题
当前编写的compute_vectors函数仅计算了连续点之间的向量,没有覆盖所有需要的线段,输出结果缺失部分内容。
现有代码
import math def compute_vectors(points): vectors = [] previous = points[0] for point in points: x = point[0] - previous[0] y = point[1] - previous[1] angle = math.degrees(math.atan2(y, x)) if angle < 0: angle += 360 length = math.sqrt(x**2 + y**2) vectors.append((angle, length)) previous = point return vectors[1:] points = [[1,1],[2,2],[3,1]] compute_vectors(points)
当前输出
[(45.0, 1.4142135623730951), (315.0, 1.4142135623730951)]
期望输出
[(45.0, 1.4142135623730951),(0.0, 2),(315.0, 1.4142135623730951)]
修正后的代码
import math def compute_vectors(points): # 按到(0,0)的距离从小到大排序点集 sorted_points = sorted(points, key=lambda p: math.hypot(p[0], p[1])) vectors = [] # 用集合记录已处理的点对,避免重复计算 processed_pairs = set() for idx_origin, origin in enumerate(sorted_points): for idx_target, target in enumerate(sorted_points): if idx_origin == idx_target: continue # 将点对转为不可变集合,确保A-B和B-A视为同一对 pair = frozenset({tuple(origin), tuple(target)}) if pair in processed_pairs: continue # 计算目标点相对原点的向量 x_diff = target[0] - origin[0] y_diff = target[1] - origin[1] # 计算角度(转换为0-360度范围) angle = math.degrees(math.atan2(y_diff, x_diff)) if angle < 0: angle += 360 # 计算长度 length = math.hypot(x_diff, y_diff) vectors.append((angle, length)) processed_pairs.add(pair) return vectors points = [[1,1],[2,2],[3,1]] print(compute_vectors(points))
代码说明
- 点排序:使用
math.hypot计算点到(0,0)的距离,以此为关键字排序点集,确保从最近的点开始处理。 - 去重逻辑:用
frozenset存储已处理的点对,因为集合是无序的,能自动识别A→B和B→A为同一线段,避免重复计算。 - 向量计算:遍历每个点作为原点,对其他所有未形成重复线段的点计算向量的角度和长度,加入结果列表。
运行修正后的代码,输出与期望一致:
[(45.0, 1.4142135623730951), (0.0, 2.0), (315.0, 1.4142135623730951)]
内容的提问来源于stack exchange,提问作者Chelsea Zou
相关产品推荐
相关产品推荐

