我正在做一个相当大的项目。当我开始时它已经完成了,我必须执行一些小动作。
其中之一是旋转地图上的标记。
选择标记后,将在图片周围绘制一个矩形(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);
}
也很好奇,当我对直线使用与对圆相同的计算时,直线以更高的速度旋转。直到我添加因子之前,圈子中也发生了同样的事情。
答案 0 :(得分:0)
所以,问题是,我不得不使用Canvas.SetLeft()和SetTop()来设置圆的位置,这基本上是围绕圆的正方形的左上角。 为了使旋转生效,我应该设置中心(但这是不可能的)。所以我不得不从顶部和左侧减去圆的半径。
Canvas.SetLeft(this.rotationSign, left-radius);
Canvas.SetTop(this.rotationSign, top-radius);