使用 Math.Asin() 旋转一个点
Rotating a point using Math.Asin()
我正在尝试围绕原点旋转一个点,我已经看到其他方法可以做到这一点,但我仍然不明白为什么我的原始代码不能正常工作。
这是我构建的原始算法。
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, then Sin(Arcsin(theta) + 附加旋转度数)
checkerhypotenuse 应该总是等于 1,而且看起来是。
您的方法(更正)可能适用于 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 不提供零坐标。
我正在尝试围绕原点旋转一个点,我已经看到其他方法可以做到这一点,但我仍然不明白为什么我的原始代码不能正常工作。 这是我构建的原始算法。
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, then Sin(Arcsin(theta) + 附加旋转度数) checkerhypotenuse 应该总是等于 1,而且看起来是。
您的方法(更正)可能适用于 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 不提供零坐标。