如何计算0~2π范围的弧夹角 解决arccos仅返回内角的问题
计算0~2π范围圆弧实际夹角的Python实现
问题说明
编写Python脚本计算弧长时,已知如下参数:
- 弧圆心坐标
(x1,y1) - 弧起点坐标
(x2,y2) - 弧终点坐标
(x3,y3) - 旋转方向(顺时针cw/逆时针ccw)
最初通过点积结合arccos公式计算夹角,存在明显缺陷:arccos的输出范围仅为0π(0180度),当弧的实际角度大于π时,只能返回两个向量的内角,无法得到真实的弧夹角。
最初使用的问题代码:
# 原问题代码(夹角范围仅支持0~π,不符合需求) import numpy as np aVector = np.array([x1 - x2, y1 - y2]) bVector = np.array([x1 - x3, y1 - y3]) aMag = np.linalg.norm(aVector) bMag = np.linalg.norm(aVector) theta = np.arccos(np.dot(aVector, bVector) / (aMag * bMag))
正确解决方案
改用atan2分别计算起止点相对于圆心的极角,再根据旋转方向调整极角顺序,最终通过取模运算得到0~2π范围内的真实弧夹角:
import math # 计算起止点相对于圆心的极角 start = math.atan2(y2 - y1, x2 - x1) end = math.atan2(y3 - y1, x3 - x1) # 顺时针旋转时交换起止极角 if gcodeAnalysis[tempLineNum][4] == "G3": # 此处为顺时针判定逻辑,可根据实际参数调整 start, end = end, start tau = 2.0 * math.pi # 两次取模保证结果落在0~2π区间内 theta = math.fmod(math.fmod(end - start, tau) + tau, tau)
验证测试
测试参数如下:
X1 = 0.00048399999999998444 Y1 = 0.0002720000000007161 X2 = 0.378484 Y2 = -14.694728 X3 = 3.376 Y3 = -14.307
该测试弧为逆时针方向,运行上述代码得到的正确结果为Theta = 6.077209477545957,符合预期。
内容的提问来源于stack exchange,提问作者Alex Jones
相关产品推荐
相关产品推荐

