我正在尝试围绕原点旋转一个点,我已经看到了其他方法,但我仍然不明白为什么我的原始代码无法正常工作。 这是我构建的原始算法。
decimal[] values = new decimal[] {5.6, 2.4, 8.7};
decimal hypotenuse = (decimal)Math.Sqrt((double)(values[0] * values[0]) + (double)(values[1] * values[1]) + (double)(values[2] * values[2]));
decimal x = values[0] / hypotenuse;
decimal y = values[1] / hypotenuse;
decimal z = values[2] / hypotenuse;
decimal checkerhypotenuse = (decimal)Math.Sqrt((double)(x * x) + (double)(y * y) + (double)(z * z));
values[0] = (decimal)Math.Sin(Math.Asin((double)x) + (double)RotationX) * hypotenuse;
values[1] = (decimal)Math.Cos(Math.Acos((double)y) + (double)RotationX) * hypotenuse;
values是我的点的x,y和z坐标的集合。而不是回馈结果,它没有正确旋转。 RotationX是旋转应在原点周围变化的弧度量。
这个概念是如果Sin(Arcsin(theta))= theta,那么Sin(Arcsin(theta)+附加旋转度) checkerhypotenuse应始终等于1,它似乎。
答案 0 :(得分:0)
你接近(纠正)可能在2D情况下工作:
cx = values[0] / hypotenuse;
cy = values[1] / hypotenuse;
values[0] = (decimal)Math.Cos(Math.ACos((double)x) + (double)RotationX) * hypotenuse;
values[1] = (decimal)Math.Sin(Math.ASin((double)y) + (double)RotationX) * hypotenuse;
但在3D情况下,你的x,y,z是direction cosines,而Math.ACos((double)x)
不会在OXY平面中给出直角。
例如:
values[0] = values[1] = values[2] = 1
绝对将点投影到OXY平面上的角度为45.但是方向余弦是1/Sqrt(3)
,而不是1/Sqrt(2)
,因此用公式旋转-45不会提供零坐标。