如何用Python计算三个极坐标点的∠FY00-FY01-FY02夹角?
用Python计算极坐标点构成的∠FY00-FY01-FY02
核心思路
要计算∠FY00-FY01-FY02,本质是求FY01点处,FY01指向FY00和FY01指向FY02两个向量的夹角。步骤分为:极坐标转直角坐标→构造目标向量→用向量点积公式计算夹角。
具体实现步骤
极坐标转直角坐标
极坐标(ρ, θ)转直角坐标(x, y)的公式:- x = ρ × cos(θ_rad)
- y = ρ × sin(θ_rad)
注意:Python标准库的三角函数默认使用弧度,所以需要先把角度θ转换成弧度。
构造目标向量
- 向量
v1:FY01 → FY00,即(FY00_x - FY01_x, FY00_y - FY01_y) - 向量
v2:FY01 → FY02,即(FY02_x - FY01_x, FY02_y - FY01_y)
- 向量
用点积计算夹角
向量点积公式:dot_product = v1_x*v2_x + v1_y*v2_y |v1| = sqrt(v1_x² + v1_y²) |v2| = sqrt(v2_x² + v2_y²) cos_theta = dot_product / (|v1| * |v2|)通过
arccos(cos_theta)得到弧度值,再转回角度就是最终结果。
完整代码示例
import math # 定义极坐标点(ρ, θ),θ单位为角度 FY00 = [0, 0] FY01 = [100, 0] FY02 = [98, 40.10] def polar_to_cartesian(rho, theta_deg): """极坐标转直角坐标,theta为角度""" theta_rad = math.radians(theta_deg) x = rho * math.cos(theta_rad) y = rho * math.sin(theta_rad) return (x, y) # 转换所有点到直角坐标 fy00_x, fy00_y = polar_to_cartesian(*FY00) fy01_x, fy01_y = polar_to_cartesian(*FY01) fy02_x, fy02_y = polar_to_cartesian(*FY02) # 构造向量 v1_x = fy00_x - fy01_x v1_y = fy00_y - fy01_y v2_x = fy02_x - fy01_x v2_y = fy02_y - fy01_y # 计算点积和模长 dot_product = v1_x * v2_x + v1_y * v2_y v1_mag = math.hypot(v1_x, v1_y) v2_mag = math.hypot(v2_x, v2_y) # 计算夹角(弧度转角度) cos_angle = dot_product / (v1_mag * v2_mag) # 处理浮点精度问题,确保cos_angle在[-1,1]范围内 cos_angle = max(min(cos_angle, 1.0), -1.0) angle_rad = math.acos(cos_angle) angle_deg = math.degrees(angle_rad) print(f"∠FY00-FY01-FY02的角度为:{angle_deg:.2f}°")
说明
- 代码中加入了对
cos_angle的范围限制,避免浮点计算误差导致超出acos的有效输入范围([-1,1])。 - 最终结果保留两位小数,可根据需求调整精度。
内容的提问来源于stack exchange,提问作者P. Scotty
相关产品推荐
相关产品推荐

