You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现正确计算各点到其余点线段角度及长度的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))

代码说明

  1. 点排序:使用math.hypot计算点到(0,0)的距离,以此为关键字排序点集,确保从最近的点开始处理。
  2. 去重逻辑:用frozenset存储已处理的点对,因为集合是无序的,能自动识别A→B和B→A为同一线段,避免重复计算。
  3. 向量计算:遍历每个点作为原点,对其他所有未形成重复线段的点计算向量的角度和长度,加入结果列表。

运行修正后的代码,输出与期望一致:

[(45.0, 1.4142135623730951), (0.0, 2.0), (315.0, 1.4142135623730951)]

内容的提问来源于stack exchange,提问作者Chelsea Zou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:40:52