使用Math.Asin()旋转一个点

时间:2017-11-24 02:07:48

标签: c# geometry trigonometry

我正在尝试围绕原点旋转一个点,我已经看到了其他方法,但我仍然不明白为什么我的原始代码无法正常工作。 这是我构建的原始算法。

        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,它似乎。

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