我正在尝试使图像旋转以跟随鼠标位置,就像小行星的船只一样,但要用鼠标位置而不是箭头键进行控制......帮助会有所帮助!
答案 0 :(得分:1)
首先,您需要知道图像的位置。然后,您可以通过MouseMove
事件找到光标位置。每次鼠标移动时都会调用此事件。您可以使用GetPosition
方法查找Point
以获取X
和Y
坐标。
private void Window_MouseMove(object sender, MouseEventArgs e)
{
Point point = e.GetPosition(null);
}
现在您已获得X
和Y
坐标,您可以使用Pythagorean Theorem查找图片与光标所在位置之间的距离。现在找到角度,AngleOfImage = sin^-1(Y/total distance between your image and cursor)
找到角度。
如果您希望图像在渲染后移动,则需要使用RenderTransform
属性。由于您需要旋转图像,因此可以使用RotateTransform
类来完成此操作。由于您已计算角度并将其设置为等于属性AngleOfImage
,因此您可以将该属性绑定到Angle
的{{1}}依赖项属性,因此您的xaml看起来像这样。< / p>
RotateTransform
用于计算角度的<Image>
<Image.RenderTransform>
<RotateTransform Angle="{Binding AngleOfImage}"/>
</Image.RenderTransform>
</Image>
事件的实际工作代码
MouseMove
其中private void Window_MouseMove(object sender, MouseEventArgs e)
{
var somePoint = e.GetPosition(mainWindow);
X = somePoint.X;
Y = somePoint.Y;
var newX = Abs(X - RectangleOriginX);
var newY = Abs(Y - RectangleOriginY);
var powX = Pow(newX, 2);
var powY = Pow(newY, 2);
var distance = Sqrt(powX + powY);
var result = newX / distance;
Angle = Asin(result).ToDegrees();
}
只是将值转换为度数的扩展方法。 ToDegrees()
和RectangleOriginX
是我控制的点,我从这里得到了
RectangleOriginY
我的工作 private void mainWindow_Loaded(object sender, RoutedEventArgs e)
{
var origialPoint = rect.TransformToAncestor(mainWindow).Transform(new Point(0, 0));
RectangleOriginX = origialPoint.X;
RectangleOriginY = origialPoint.Y;
}
xaml
答案 1 :(得分:-1)
抱歉我的英文不好
尝试使用System.Windows.Forms.Timer
,并在Timer_tick
事件中调用一些Move(MouseEventArgs e)
。
像这样的东西
private void Move(MouseEventArgs e)
{
if(mainwindow has focus)
{
your_image.Position = NextPosition(e);
}
}
MouseEventArgs
的实例是您的类的字段,它在MouseMove事件中更改。
在NextPosition中,您可以使用任何pathfind算法
答案 2 :(得分:-1)
如果我能理解你的话
你可以通过一些数学来实现它
Math.ASin()
获取角度Math.ASin(x / d);
x将是鼠标位置 - 图像中心位置
d将是图像中心与鼠标位置之间的距离,您可以通过Pythagorean theorem
获取它然后使用计时器来实现这一目标。
我希望我的回答能帮到你。