2009-11-22 170 views
0

例如:我有一个分成两半的圆。一半从0到-179,99999999999,而另一半从0到179,99999999999。典型示例:CALayer的transform.rotation.z。而不是从0到360达到这个水平。因此,当我想开发一个规范(理论上)时,我想读取从0到360的值,而不是得到-142,并考虑可能在0-360范围内的值。如何将负向旋转值转换为正向旋转值?

如何正确地将数学转换为数学?正弦?余弦?这有什么用处吗?

+0

为什么不按照您提到的问题提供的建议:http://stackoverflow.com/questions/1778738/how-to-resolve-this-rotation-problem并创建一个单独的实例变量来跟踪旋转,而是比依靠一个图层的变换? – 2009-11-22 15:48:44

回答

2

不是由简单的东西作为实现正常化:

assert(value >= -180.0 && value <= +180.0); 
if (value < 0) 
    value += 360.0; 

我可能把这个连成一个功能,如果我要去需要在多个地方。如果代码需要处理可能已经被标准化的数字,那么你改变断言。如果它需要处理范围在-180 .. + 360之外的数字,那么你有更多的工作要做(增加或减少360的适当倍数)。

+0

这种方法比负数更直观。假设你在-1和1度之间旋转,数字将从359跳到1.如果你把它放在一个可视化的显示器上,它会非常烦人。我的做法改变了原点,使转变继续下去。 – 2009-11-23 00:36:53

+1

@ZZ编码器:在指南针上,承载359°与001°相差2度,与-1°和+ 1°相差2度。所以,我不明白你的反对意见。但是,我仍然认为将180°加到轴承意味着它在与添加偏移量之前指向的方向相反。 – 2009-11-23 00:56:43

0

x与范围(-180,180)的值,是y要显示的值,

y = x + 180; 

这将改变移读数范围(0,360)。

+0

目标可能是从-180到-0的值映射到180到360,而不是简单地添加180个所有值。对于方向,加180转向行进的方向。 – 2009-11-22 18:12:18

2
while (x < 0) { 
    x = x + 360; 
    } 

while (x > 360) { 
    x = x - 360; 
    } 

这将适用于任何值,正值或负值。

0

如果你不介意这已经是正值花费一些额外的CPU周期,这应该对任何值-360 < X < 360工作:

x = (x + 360) % 360; 
+0

它取决于宿主语言,但如果表达式的非整数,'%'在C或C++中不起作用。 – 2009-11-22 18:10:21

+1

似乎我在其他语言中花费太多时间。看起来在math.h中有一个函数fmod(),但可能不在iPhone上。那么使用条件/循环可能更安全。 – 2009-11-22 21:55:28