SymPy中Polygon.angles()返回角度值异常问题咨询
SymPy多边形顶点角度计算异常的原因与解决办法
问题原因
SymPy的Polygon.angles返回的是有向内角,角度值的正负和多边形的**环绕方向(顺时针/逆时针)**直接相关:
- 顶点按顺时针顺序排列时,内角为0-180度的正值;
- 顶点按逆时针顺序排列时,内角会被计算为对应补角(比如原本45度的角会变成315度,即360-45)。
你调整顶点顺序后,多边形的环绕方向反转,导致(0,0)点的角度从45度变为315度。
解决办法
方法1:统一多边形的环绕方向
使用SymPy的oriented方法,强制将多边形转为顺时针或逆时针方向,确保角度计算逻辑一致:
from sympy import Polygon, Point2D import math # 调整后的顶点序列 polyline = ((8,8),(15,8),(15,0),(23,0),(23,20),(0,20),(0,0)) point2D_poly = [Point2D(p) for p in polyline] poly = Polygon(*point2D_poly) # 强制转为顺时针方向(传入"ccw"可转为逆时针) poly = poly.oriented("cw") for p in point2D_poly: angle = poly.angles[p].evalf() * 180 / math.pi print(f"点{p}的角度:{angle}")
方法2:修正角度值
对计算出的角度取模360后,转换为0-180度的内角:
from sympy import Polygon, Point2D import math polyline = ((8,8),(15,8),(15,0),(23,0),(23,20),(0,20),(0,0)) point2D_poly = [Point2D(p) for p in polyline] poly = Polygon(*point2D_poly) for p in point2D_poly: angle_rad = poly.angles[p].evalf() angle_deg = angle_rad * 180 / math.pi # 修正为0-180度的内角 corrected_angle = angle_deg % 360 if corrected_angle > 180: corrected_angle = 360 - corrected_angle print(f"点{p}的角度:{corrected_angle}")
内容的提问来源于stack exchange,提问作者Amin reguig
相关产品推荐
相关产品推荐

