[英]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,則Sin(Arcsin(theta)+附加旋轉度)的斜邊應始終等於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是方向余弦 ,而Math.ACos((double)x)
在OXY平面中不給出直角。
例如:
values[0] = values[1] = values[2] = 1
點到OXY平面的絕對投影角度為45度。但是,余弦方向為1/Sqrt(3)
,而不是1/Sqrt(2)
,因此使用公式旋轉-45不會提供零坐標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.