例如:我有一个分成两半的圆。一半从0到-179,99999999999,而另一半从0到179,99999999999。典型示例:CALayer的transform.rotation.z。而不是从0到360达到这个水平。因此,当我想开发一个规范(理论上)时,我想读取从0到360的值,而不是得到-142,并考虑可能在0-360范围内的值。如何将负向旋转值转换为正向旋转值?
如何正确地将数学转换为数学?正弦?余弦?这有什么用处吗?
例如:我有一个分成两半的圆。一半从0到-179,99999999999,而另一半从0到179,99999999999。典型示例:CALayer的transform.rotation.z。而不是从0到360达到这个水平。因此,当我想开发一个规范(理论上)时,我想读取从0到360的值,而不是得到-142,并考虑可能在0-360范围内的值。如何将负向旋转值转换为正向旋转值?
如何正确地将数学转换为数学?正弦?余弦?这有什么用处吗?
不是由简单的东西作为实现正常化:
assert(value >= -180.0 && value <= +180.0);
if (value < 0)
value += 360.0;
我可能把这个连成一个功能,如果我要去需要在多个地方。如果代码需要处理可能已经被标准化的数字,那么你改变断言。如果它需要处理范围在-180 .. + 360之外的数字,那么你有更多的工作要做(增加或减少360的适当倍数)。
这种方法比负数更直观。假设你在-1和1度之间旋转,数字将从359跳到1.如果你把它放在一个可视化的显示器上,它会非常烦人。我的做法改变了原点,使转变继续下去。 – 2009-11-23 00:36:53
@ZZ编码器:在指南针上,承载359°与001°相差2度,与-1°和+ 1°相差2度。所以,我不明白你的反对意见。但是,我仍然认为将180°加到轴承意味着它在与添加偏移量之前指向的方向相反。 – 2009-11-23 00:56:43
说x
与范围(-180,180)的值,是y
要显示的值,
y = x + 180;
这将改变移读数范围(0,360)。
目标可能是从-180到-0的值映射到180到360,而不是简单地添加180个所有值。对于方向,加180转向行进的方向。 – 2009-11-22 18:12:18
while (x < 0) {
x = x + 360;
}
while (x > 360) {
x = x - 360;
}
这将适用于任何值,正值或负值。
如果你不介意这已经是正值花费一些额外的CPU周期,这应该对任何值-360 < X < 360工作:
x = (x + 360) % 360;
它取决于宿主语言,但如果表达式的非整数,'%'在C或C++中不起作用。 – 2009-11-22 18:10:21
似乎我在其他语言中花费太多时间。看起来在math.h中有一个函数fmod(),但可能不在iPhone上。那么使用条件/循环可能更安全。 – 2009-11-22 21:55:28
我提供的代码返回0 - 从this answer的层转换属性到您的previous question的360度角度值。
为什么不按照您提到的问题提供的建议:http://stackoverflow.com/questions/1778738/how-to-resolve-this-rotation-problem并创建一个单独的实例变量来跟踪旋转,而是比依靠一个图层的变换? – 2009-11-22 15:48:44