程序中使用弧度的注意事项
[編輯] [转简体] (简体译文)
|
作者:huidong
| 分類:【編程】雜項
[
32 瀏覽
0 評論
4 贊
3 踩
]
概要
正文
我在程序中使用弧度进行一些运算,由于我只关心角的终边位置,所以一开始是打算把所有弧度都统一到区间 [0, 2π) 内,这样我后续的运算全部都只需在 [0, 2π) 内考虑。
但后来我发现这样做不太现实。当涉及到区间时,即使是长度小于 2π 的区间,比方说 [3π/2, 13π/6] 或减去 2π 得到的 [-π/2, π/6] 就不能转换到 [0, 2π] 之中。
因此,如果我们的弧度数据范围在 [0, 2π) 内,那么对于 2π 以内长度的区间我们其实应该考虑 [-2π, 2π) 的范围,才能表示所有长度小于 2π 的区间。在实际应用中,考虑 [-2π, 4π) 的范围会使问题处理起来更方便。例如,如果要判定一个 [0, 2π) 内的弧度值是否位于一个区间内(只关心终边位置),可以像这样同时判定给定区间的相邻周期区间:
// 判断一个弧度值是否位于某开区间内(同时自动匹配该区间的相邻周期区间) bool IsInRange(double _X, double _Begin, double _End) { return (_X > _Begin && _X < _End) || (_X > _Begin - 2 * PI && _X < _End - 2 * PI) || (_X > _Begin + 2 * PI && _X < _End + 2 * PI); }
另一点需要注意的是,由于区间的某个端点可能是负值,这就会导致一个 [0, 2π) 内的弧度值减去它可能得到一个大于等于 2π 的值,由此我们也可以预料到弧度的其它运算也可能会产生一些不在我们考虑范围内的数值,因此我们可能需要对代码中的弧度运算进行思考,考虑一些意外的运算结果,并将这些结果重新再转换到 [0, 2π) 区间内,或者是进行其他处理。例如,将任意弧度转换到 [0, 2π) 区间内:
// 将一个弧度转换到 [0, 2π) 内 double GetStandardRadian(double _X) { double X = _X; while (!(X >= 0 && X < 2 * PI)) { if (X < 0) X += 2 * PI; else if (X >= 2 * PI) X -= 2 * PI; } return X; }