Вращающиеся объекты на холсте - PullRequest
0 голосов
/ 16 октября 2018

Я работаю над довольно крупным проектом.Когда я начинал, это уже было закончено, и мне пришлось реализовать несколько небольших уловок.

Одним из них является вращение маркера на карте.

Когда маркер выбран, вокруг рисунка рисуется прямоугольник (System.Wndows.FrameWorkElement).Поскольку мне пришлось бы переписать всю программу, чтобы использовать другой прямоугольник, я должен придерживаться элемента framework.Чтобы повернуть эту вещь, я добавил линию и круг.

Линия соединяет круг с прямоугольником.Когда пользователь нажимает на круг и перетаскивает мышь, все это должно вращаться вокруг центра прямоугольника.

Пока что вращение прямоугольника и линии работает нормально.Но круг, хотя он и вращается вокруг центра прямоугольника, также вращается вокруг точки на своей границе.Я вращаю прямоугольник с помощью объекта RenderTransform, который работает достаточно хорошо и достаточно просто.Для линии и круга я написал метод расчета поворота.Линия, которую я могу вычислить без использования угла.

Вот метод:

private void SetPositionOfRotationShaft(Point center)
    {
        double l = Math.Sqrt(Math.Pow((this.ConnectionLineDirection.X - center.X), 2) + Math.Pow((this.ConnectionLineDirection.Y - center.Y), 2));
        double factor = Math.PI / 180;

        this.connectionLine.X1 = center.X + (this.surroundingRectangle.Height / (2 * l)) * (this.ConnectionLineDirection.X - center.X);
        this.connectionLine.Y1 = center.Y + (this.surroundingRectangle.Height / (2 * l)) * (this.ConnectionLineDirection.Y - center.Y);
        this.connectionLine.X2 = center.X + ((this.surroundingRectangle.Height + 40) / (2 * l)) * (this.ConnectionLineDirection.X - center.X);
        this.connectionLine.Y2 = center.Y + ((this.surroundingRectangle.Height + 40) / (2 * l)) * (this.ConnectionLineDirection.Y - center.Y);

        double translatedLeft = Canvas.GetLeft(this.rotationSign) - center.X;
        double translatedTop = Canvas.GetTop(this.rotationSign) - center.Y;
        double left = ((translatedLeft * Math.Cos(-this.rotateSurroundingRectangle.Angle*factor)) + (translatedTop * Math.Sin(-this.rotateSurroundingRectangle.Angle*factor))) + center.X;
        double top = ((translatedTop * Math.Cos(-this.rotateSurroundingRectangle.Angle * factor)) - (translatedLeft * Math.Sin(-1 * this.rotateSurroundingRectangle.Angle * factor))) + center.Y;
        Canvas.SetLeft(this.rotationSign, left);
        Canvas.SetTop(this.rotationSign, top);
      }

Также любопытно, когда я использую те же вычисления для линии, что и для круга, линиивращается с более высокой скоростью.То же самое происходило с кругом, пока я не добавил фактор.

1 Ответ

0 голосов
/ 17 октября 2018

Итак, проблема заключалась в том, что мне нужно было установить положение круга с помощью Canvas.SetLeft () и SetTop (), что существенно в верхнем левом углу квадрата вокруг круга.Чтобы мое вращение работало, я должен был установить центр (но это невозможно).Поэтому мне пришлось вычесть радиус круга сверху и слева.

Canvas.SetLeft(this.rotationSign, left-radius);
Canvas.SetTop(this.rotationSign, top-radius);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...