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

如何用Numpy计算两条直线交点处的夹角?求方法验证

计算直线交点处夹角的问题排查与正确实现

问题描述

排查程序bug时需验证直线夹角计算方法的正确性。给定以下Numpy代码,需计算直线a与b交点处的夹角θ(要求仅使用Numpy)。自行实现的代码得到约29度的结果,请问该方法为何不正确?

示例代码

import numpy as np

n = 1000
x = np.arange(n)
a = np.ones(n) * 3  # 直线a: y=3
b = -0.11 * x - 112  # 直线b: y=-0.11x-112

错误实现

def _angle(a, b):
    return np.degrees(np.arccos(np.dot(a, b)/ (np.linalg.norm(a) * np.linalg.norm(b))))  

print(_angle(a,b))

错误原因

你错误地将直线上的y值数组当成了直线的方向向量来计算点积:

  • 变量a是全3的数组,对应直线y=3上的y坐标集合;b是直线y=-0.11x-112上的y坐标集合,二者都不是直线的方向向量。
  • 计算这两个数组的点积与模长比值,得到的是数组元素的相似度,和两条直线的夹角没有任何关系,因此结果完全错误。

正确实现思路与代码

直线的夹角由它们的方向向量决定:

  1. 直线y=3是水平直线,方向向量可取(1, 0)(x轴正方向);
  2. 直线y=-0.11x-112的斜率为-0.11,方向向量可取(1, -0.11)(x每增加1,y减少0.11);
  3. 利用向量点积公式计算夹角,同时确保结果是两条直线之间的最小角(不超过90度)。

正确代码

import numpy as np

def calculate_line_angle():
    # 定义两条直线的方向向量
    v1 = np.array([1, 0])    # 直线a的方向向量(水平向右)
    v2 = np.array([1, -0.11])# 直线b的方向向量
    
    # 计算点积与模长乘积,用clip避免浮点误差导致的超出[-1,1]范围
    dot_product = np.dot(v1, v2)
    norm_product = np.linalg.norm(v1) * np.linalg.norm(v2)
    cos_theta = np.clip(dot_product / norm_product, -1.0, 1.0)
    
    # 弧度转角度,取最小夹角
    angle_deg = np.degrees(np.arccos(cos_theta))
    if angle_deg > 90:
        angle_deg = 180 - angle_deg
    
    return angle_deg

print(calculate_line_angle())

运行结果约为6.28度,这才是两条直线交点处的正确夹角。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:55:16