Я работаю над довольно крупным проектом.Когда я начинал, это уже было закончено, и мне пришлось реализовать несколько небольших уловок.
Одним из них является вращение маркера на карте.
Когда маркер выбран, вокруг рисунка рисуется прямоугольник (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);
}
Также любопытно, когда я использую те же вычисления для линии, что и для круга, линиивращается с более высокой скоростью.То же самое происходило с кругом, пока я не добавил фактор.