在画布上旋转对象

时间:2018-10-16 11:54:42

标签: c# wpf

我正在做一个相当大的项目。当我开始时它已经完成了,我必须执行一些小动作。

其中之一是旋转地图上的标记。

选择标记后,将在图片周围绘制一个矩形(System.Wndows.FrameWorkElement)。因为我基本上必须重写整个程序才能使用另一个矩形,所以我必须坚持使用frame元素。 要旋转此东西,我添加了一条直线和一个圆。

线将圆与矩形连接起来。当用户单击圆并拖动鼠标时,整个对象应该围绕矩形的中心旋转。

到目前为止,矩形和直线的旋转效果很好。但是,圆虽然绕矩形的中心旋转,但也绕其自身边界处的点旋转。 我使用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 :(得分:0)

所以,问题是,我不得不使用Canvas.SetLeft()和SetTop()来设置圆的位置,这基本上是围绕圆的正方形的左上角。 为了使旋转生效,我应该设置中心(但这是不可能的)。所以我不得不从顶部和左侧减去圆的半径。

Canvas.SetLeft(this.rotationSign, left-radius);
Canvas.SetTop(this.rotationSign, top-radius);