c# - 角度偏移和正/负角度
问题描述
我一直坚持旋转带有偏移量的资产。
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° 移动
解决方案
设当前方向向量为(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
推荐阅读
- ios - 核心数据 | 即使没有在 swift 中标记,自动生成的 String 和 Date 属性也是可选的
- html - 将两个元素(图标和)作为一个元素的可访问性
- node.js - 升级 React 库版本:建议只推送 package.json 还是同时推送 package.json 和 package-lock.json?
- r - 在闪亮中更改变量的数据类型
- machine-learning - 决策树 - 决策树如何在每个节点上选择规则
- dialogflow-es - 帐户关联不起作用(Dialogflow)
- spring-boot - 自动配置和活动配置文件可以在spring boot中组合吗?
- angular - 弃用警告:由于安全性和可用性问题,不推荐使用 Buffer()
- ios - 在目标 C 中点击下一个和上一个按钮时,ScrollView 无法正确移动
- javascript - 如何在 owl.carousel.js 中响应设置宽度?