





















我们讨论的关键是角度差值是否应该规范化到 [-180°, 180°] 这个范围内。跨越360° 的真正意思是“顺时针还是逆时针旋转”,而不仅仅是差值是否大于180°。我们需要明确地理解两种情况:
[-180°, 180°] 范围。[-180°, 180°] 范围内。假设有两个角度,angle1 和 angle2,我们计算其差值 diff = angle1 - angle2,然后做规范化。规范化就是:
angle1 = 270°,angle2 = 10°差值计算:
diff=270∘−10∘=260∘\text{diff} = 270^\circ - 10^\circ = 260^\circdiff=270∘−10∘=260∘由于差值 260° 大于 180°,应该规范化为 -100°,即将 260° 减去 360°:
这代表从 270° 逆时针转到 10° 的差值是 -100°,符合预期。
angle1 = 10°,angle2 = 270°差值计算:
diff=10∘−270∘=−260∘\text{diff} = 10^\circ - 270^\circ = -260^\circdiff=10∘−270∘=−260∘由于差值 -260° 小于 -180°,应该规范化为 100°,即将 -260° 加上 360°:
这代表从 270° 顺时针转到 10° 的差值是 100°,符合预期。
public double calculateAngleDifference(double angle1, double angle2) { // 计算原始角度差 double diff = angle1 - angle2; // 规范化差值到[-180°, 180°] if (diff > 180) { diff -= 360; // 角度差大于180°,跨越了360° } else if (diff < -180) { diff += 360; // 角度差小于-180°,跨越了-360° } // 返回规范化后的差值 return diff; }
angle1 = 270°,angle2 = 10°:计算 270° - 10° = 260°,然后规范化为 -100°。angle1 = 10°,angle2 = 270°:计算 10° - 270° = -260°,然后规范化为 100°。[-180°, 180°] 范围内。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。