Самый простой способ получить угол положения мыши в WPF относительно центра круга - PullRequest
2 голосов
/ 24 января 2011

У меня есть кружок, когда мышка движется, я могу получить e.GetPosition (this).Но как программно получить угол относительно центра круга?

Я видел в Интернете несколько примеров часов с привязкой в ​​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 ]

3 голосов
/ 24 января 2011

Вы можете использовать Atan2 http://msdn.microsoft.com/en-us/library/system.math.atan2.aspx.

public static double Atan2(
    double y,
    double x
)

, просто передавая y в качестве дельты между мышью, координатой y и центром круга, и то же самое для x.Обратите внимание, что результат выражается в radiant.if это круг, и у вас есть X, Y относительно круга, который вы можете передать radius-y, radius-x, если это эллипс, вы можете передать height / 2-y,ширина / 2-х.

2 голосов
/ 24 января 2011

ОК, MouseEventArgs предоставляет функцию 'GetPosition', которая запрашивает элемент пользовательского интерфейса, который даст вам относительное положение мыши. Это в основном то, что вы хотите сделать.

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

1 голос
/ 24 января 2011

Тригонометрия может сделать это для вас.

Так что вы захотите использовать для этого Арктангенс (который находится в System.Math.ATan).

Вам также понадобитсядля учета случаев, когда угол кратен пи / 2 (или 90 градусам).

...