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

Python计算直线夹角结果异常:问题排查与优化方法

解决直线夹角计算的问题

原代码的核心问题

  • 竖直线的斜率计算时分母为0,会得到inf(无穷大),基于斜率的计算逻辑直接失效,这是最根本的问题。
  • math.atan2(slope_B, slope_A)用法错误,该函数是用来计算点(x,y)的极角,并非直接计算两条直线斜率的夹角,逻辑完全不对。

改进方案:用向量计算夹角

直线的夹角本质是其方向向量的夹角,这种方法能完美处理竖直线、水平线等特殊情况,且计算准确。

方法一:向量点积法

import math

def find_angle(line1, line2):
    # 计算两条直线的方向向量
    v1 = (line1[1][0] - line1[0][0], line1[1][1] - line1[0][1])
    v2 = (line2[1][0] - line2[0][0], line2[1][1] - line2[0][1])
    
    # 计算向量点积
    dot_product = v1[0] * v2[0] + v1[1] * v2[1]
    # 计算向量模长
    mag_v1 = math.hypot(v1[0], v1[1])
    mag_v2 = math.hypot(v2[0], v2[1])
    
    # 处理浮点误差,确保余弦值在[-1,1]范围内
    cos_theta = max(min(dot_product / (mag_v1 * mag_v2), 1.0), -1.0)
    # 计算弧度并转换为角度
    angle_rad = math.acos(cos_theta)
    angle_deg = math.degrees(angle_rad)
    
    # 若需要大于90度的夹角,取补角
    actual_angle = 180 - angle_deg if angle_deg < 90 else angle_deg
    return actual_angle

# 测试你的坐标
green_line = [(923, 286), (1495, 306)]
blue_line = [(901, 259), (901, 197)]
print(find_angle(green_line, blue_line))

点积计算的是两条直线的最小夹角(0-90度),你的场景中最小夹角约为87度,对应的补角就是93度,和预期结果一致。

方法二:方向角求差法

import math

def find_angle(line1, line2):
    # 计算直线1的方向角(与x轴正方向的夹角)
    dx1, dy1 = line1[1][0] - line1[0][0], line1[1][1] - line1[0][1]
    angle1 = math.atan2(dy1, dx1)
    
    # 计算直线2的方向角
    dx2, dy2 = line2[1][0] - line2[0][0], line2[1][1] - line2[0][1]
    angle2 = math.atan2(dy2, dx2)
    
    # 计算角度差的绝对值,转换为0-180度范围
    angle_diff = abs(angle1 - angle2)
    angle_deg = math.degrees(min(angle_diff, 2*math.pi - angle_diff))
    
    # 若需要大于90度的夹角,取补角
    actual_angle = 180 - angle_deg if angle_deg < 90 else angle_deg
    return actual_angle

# 测试
green_line = [(923, 286), (1495, 306)]
blue_line = [(901, 259), (901, 197)]
print(find_angle(green_line, blue_line))

该方法通过atan2直接基于向量的横纵差计算方向角,避开了斜率的问题,同样能得到正确的93度左右的结果。

内容的提问来源于stack exchange,提问作者black sparrow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:50:11