获取WPF中鼠标位置相对于圆心的最简单方法

时间:2011-01-24 16:06:03

标签: wpf wpf-controls

当我移动鼠标时我有一个圆圈我可以获得e.GetPosition(这个)。但是如何以编程方式获得相对于圆心的角度?

我在互联网上看到一些带有XAML绑定的采样时钟。这不是我想要的,我想从鼠标位置获得相对于圆心的角度值。

这就是我的尝试:

    private void ellipse1_MouseMove(object sender, MouseEventArgs e)
    {

        Point position = e.GetPosition(this);
        double x = position.X;
        double y = position.Y;
        double angle;
        double radians;
        radians = Math.Atan2(y, x);
        angle = radians * (180 / Math.PI);           

    }

角度似乎不正确从不得到0也不是90 180。

3 个答案:

答案 0 :(得分:3)

您可以使用Atan2 http://msdn.microsoft.com/en-us/library/system.math.atan2.aspx

public static double Atan2(
    double y,
    double x
)

只是将y作为鼠标y坐标和圆心之间的差值传递,而x则相同。 注意结果以radiant表示。如果它是一个圆,你有X,Y相对于圆可以传递radius-y,radius-x,如果它是一个椭圆,你可以传递高度/ 2-y,宽度/ 2-X。

答案 1 :(得分:2)

好的,MouseEventArgs公开了函数'GetPosition',它要求一个UI元素,它将为您提供相对的鼠标位置。这基本上就是你想要做的。

private void ellipse1_MouseMove(object sender, MouseEventArgs e)
{
  // This will get the mouse cursor relative to the upper left corner of your ellipse.
  // Note that nothing will happen until you are actually inside of your ellipse.
  Point curPoint = e.GetPosition(ellipse1);

  // Assuming that your ellipse is actually a circle.
  Point center = new Point(ellipse1.Width / 2, ellipse1.Height / 2);

  // A bit of math to relate your mouse to the center...
  Point relPoint = new Point(curPoint.X - center.X, curPoint.Y - center.Y);

  // The fruit of your labor.
  Console.WriteLine("({0}:{1})", relPoint.X, relPoint.Y);
}

从您的评论和其他帖子中可以看出,您现在可以自己处理实际角度计算部分,因为您拥有正确的信息。就单位而言,WPF使用独立于设备的坐标系。因此,半径为50的圆不一定是50像素。这一切都取决于你的系统,屏幕分辨率等。这一切都很无聊,但如果你真的感兴趣,这将为你解释一些。

http://msdn.microsoft.com/en-us/library/ms748373.aspx

答案 2 :(得分:1)

三角学可以为你做到这一点。

因此,您需要使用Arc Tangent执行此操作(可在System.Math.ATan中找到)。

您还需要考虑角度是pi / 2(或90度)的倍数的情况。