当我移动鼠标时我有一个圆圈我可以获得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。
答案 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像素。这一切都取决于你的系统,屏幕分辨率等。这一切都很无聊,但如果你真的感兴趣,这将为你解释一些。
答案 2 :(得分:1)
三角学可以为你做到这一点。
因此,您需要使用Arc Tangent执行此操作(可在System.Math.ATan中找到)。
您还需要考虑角度是pi / 2(或90度)的倍数的情况。