【python】Calculate the Angle of a Triangle

要计算三个点形成的三角形每个角的角度,可以按照以下步骤进行:

  • 计算边的长度:使用欧几里得距离公式计算三角形三边的长度。

  • 应用余弦定理:对于每个角,使用余弦定理计算角度。余弦定理公式为:

c o s ( θ ) = a 2 + b 2 − c 2 2 a b cos(\theta) = \frac{a^2 + b^2 - c^2}{2ab} cos(θ)=2aba2+b2−c2

其中 θ \theta θ 是角, a a a 和 b b b 是角的两边, c c c 是对边。

python 代码实现

python 复制代码
import math

def calculate_angle(a, b, c):
    """
    计算三角形中顶点b的角度(使用余弦定理)
    :param a: 点a的坐标 (x, y)
    :param b: 点b的坐标 (x, y)
    :param c: 点c的坐标 (x, y)
    :return: 顶点b的角度(弧度制)
    """
    # 计算边长
    ba = math.sqrt((a[0] - b[0])**2 + (a[1] - b[1])**2)
    bc = math.sqrt((c[0] - b[0])**2 + (c[1] - b[1])**2)
    ac = math.sqrt((a[0] - c[0])**2 + (a[1] - c[1])**2)
    
    # 应用余弦定理
    cos_theta = (ba**2 + bc**2 - ac**2) / (2 * ba * bc)
    # 处理浮点数精度问题,确保cos_theta在[-1, 1]范围内
    cos_theta = max(min(cos_theta, 1.0), -1.0)
    angle = math.acos(cos_theta)
    return angle

def calculate_triangle_angles(p1, p2, p3):
    """
    计算三角形三个顶点的角度
    :param p1: 点1的坐标 (x, y)
    :param p2: 点2的坐标 (x, y)
    :param p3: 点3的坐标 (x, y)
    :return: 三个角度(弧度制),按p1, p2, p3的顺序
    """
    angle1 = calculate_angle(p2, p1, p3)  # 角1在p1
    angle2 = calculate_angle(p1, p2, p3)  # 角2在p2
    angle3 = calculate_angle(p1, p3, p2)  # 角3在p3
    return angle1, angle2, angle3

# 示例使用
if __name__ == "__main__":
    # 三个点的坐标(示例)
    point_a = (0, 0)
    point_b = (1, 0)
    point_c = (0, 1)
    
    # 计算角度
    angle_a, angle_b, angle_c = calculate_triangle_angles(point_a, point_b, point_c)
    
    # 转换为角度制
    angle_a_deg = math.degrees(angle_a)
    angle_b_deg = math.degrees(angle_b)
    angle_c_deg = math.degrees(angle_c)
    
    print(f"角A: {angle_a_deg:.2f}°")
    print(f"角B: {angle_b_deg:.2f}°")
    print(f"角C: {angle_c_deg:.2f}°")

代码说明:

calculate_angle函数:计算顶点 b 的角度。通过计算三边长度,应用余弦定理得到角度(弧度制)。

calculate_triangle_angles函数:分别计算三个顶点的角度。

math.degrees 可以把弧度转为角度

示例:计算直角三角形的三个角度(45°, 90°, 45°)。

上面的例子用的笛卡尔坐标系,也适用于图像坐标系(原点在左上角)

相关推荐
冷雨夜中漫步2 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴3 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再3 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
颜酱4 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_736919104 小时前
C++代码风格检查工具
开发语言·c++·算法
yugi9878384 小时前
基于MATLAB强化学习的单智能体与多智能体路径规划算法
算法·matlab
喵手4 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_944934734 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy4 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
DuHz4 小时前
超宽带脉冲无线电(Ultra Wideband Impulse Radio, UWB)简介
论文阅读·算法·汽车·信息与通信·信号处理