使用 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 不提供零坐标。