如何将角度从 [0..360] 映射到 [-180..180]

How to map angles from [0..360] to [-180..180]

提问人:iter 提问时间:11/10/2022 最后编辑:iter 更新时间:4/30/2023 访问量:566

问:

我现在正在画一个空白。我需要在“有符号”和“无符号”度数之间来回转换,[-180..180] 和 [0..360]

从 [-180..180] 到 [0..360] 的简单方法是

(d+360) % 360(+360 消除了某些语言中关于符号的歧义)。

如何进行逆运算?我能做

if d<180 d else d-360

但它看起来很丑。

编辑:以下是一些示例数字。我想绘制这个地图

[0, 90, 180, 270, 360]

对此:

[0, 90, 180, -90, 0]

编辑 2:好了,大脑冻结结束了。答案是

(A+180)%360-180

与数学 语言无关

评论

2赞 High Performance Mark 11/10/2022
你肯定只是减去 180°?
0赞 iter 11/10/2022
map(lambda a: a-360, (0, 90, 180, 270, 360)) -> [-360, -270, -180, -90, 0] 我正在寻找 [0, 90, 180, -90, 0]
1赞 President James K. Polk 11/10/2022
减去 180 完全符合您在问题中要求的效果,现在您说它不符合您的需求。你需要什么,它对你有什么作用?也许举几个角度的例子及其翻译。此外,您可能应该打开两个间隔的一端。-180 和 180 都表示相同的角度。
1赞 iter 11/10/2022
@PresidentJamesK.Polk 减去 180 映射 180 到 0 和 0 到 180。它实际上将指南针旋转 180 度,指向北向南。您可以查看我上面的两条评论,了解示例数据以及您和 High Performace Mark 建议的减法如何产生不同的结果。
2赞 President James K. Polk 11/10/2022
哈哈,一旦你做了几个例子,你就自己想通了:)

答:

-1赞 Isaí 11/10/2022 #1

要将一个区间映射到另一个区间,可以使用线性插值 喜欢

float map(float n, float x1, float x2, float y1, float y2)
{
    float m = (y2 - y1) / (x2 - x1);
    return y1 + m * (n - x1);
}

其中 x1 <= n <= x2,结果值介于 y1 和 y2 之间

评论

0赞 iter 11/10/2022
我不认为这能满足我的需求。它将映射 0° 到 -180°、180° 到 0° 和 360° 到 180°。
3赞 iter 11/10/2022 #2

好吧,大脑冻结的答案是

(a+180)%360-180