首页 > 解决方案 > 角度偏移和正/负角度

问题描述

我一直坚持旋转带有偏移量的资产。

Sstart = e.GetPosition(dial);
        
        if (dial.IsStylusCaptured)
        {               
            AngleRot = Math.Atan2((Y - Sstart.Y) , (X - Sstart.X));
            radAngle = AngleRot / Math.PI * 180 + 180;
            radAngle = radAngle - AthetaD;
            di.RenderTransform = new RotateTransform(radAngle + 90);                     
        }  

使用它,我能够将我的对象从 0° 以 x 的偏移量旋转到角度 theta。但是当我进行第二次旋转时,它不是从角度 theta 以偏移 x 旋转,而是将对象重置回 0°。我怎样才能使偏移始终来自 theta 而不是 0°?

在这里我以偏移角度旋转

在这里我以偏移角度旋转

在这里,我的角度重置为 0°,而不是从 -56° 移动

在这里,我的角度重置为 0°,而不是从 -56° 移动

标签: c#mathrotation

解决方案


设当前方向向量为(cx, cy)

在开始时将其设置为(1,0)或其他需要的值。

当你旋转表盘时,你有新的方向

nx = X - Sstart.X
ny = Y - Sstart.Y

要将当前方向矢量旋转到新的方向,您需要计算相对角度。这种方法使用向量的叉积和点积。也许您需要更改第一个表达式的符号

Angle =  Math.Atan2(nx * cy - ny * cx, cx * nx + cy * ny)
..apply rotation by Angle

旋转后记住当前方向以便以后使用

cx = nx
cy = ny

推荐阅读