0

我有一个 C#(Windows 窗体)程序,它在图片框上有一个矩形。它们也可以以一定角度绘制(旋转)。我想用我的鼠标移动来旋转那个矩形。

我有移动那个矩形的代码

Rectangle areaRect = new Rectangle(100,100, 300, 300);
Bool dragging = false;
Point ptOld = new Point(0, 0);

protected override void OnPaint(PaintEventArgs e)
{
  Graphics dcPaint = e.Graphics;
  dcPaint.DrawRectangle(rectPen, areaRect);
}

protected override void OnMouseDown(MouseEventArgs e)
{
  ptOld = new Point(e.X, e.Y);
  dragging = true;
}

protected override void OnMouseMove(MouseEventArgs e)
{
  if(dragging = true) 
  {
    Point ptNew = new Point(e.X, e.Y);
    int dx = ptNew.X - ptOld.X;
    int dy = ptNew.Y - ptOld.Y;
    areaRect.Offset(dx, dy); // This one moves the rectangle 
    ptOld = ptNew;
    this.Invalidate();
  }
}

protected override void OnMouseUp(MouseEventArgs e)
{
  dragging = false;
}

现在我的要求是旋转这个矩形,任何想法,如何实现。

4

3 回答 3

2

我想你想计算 X 轴上两点之间的角度。如果是这样,请尝试以下代码:

const double Rad2Deg = 180.0 / Math.PI;

return Math.Atan2(ptOld.Y - e.Y, e.X - ptOld.X) * Rad2Deg;

另请查看有关计算两点之间角度的这篇文章

于 2012-04-15T19:30:31.623 回答
0

您可以使用新旧 x 鼠标坐标(在您的示例中为 dx)之间的差异来计算角度。您可以使用RotateTransformGraphics 对象的方法来旋转矩形。

除了翻译之外,我修改了您的代码以进行旋转。您可以使用鼠标左键移动矩形,也可以使用鼠标右键旋转它。

Rectangle areaRect = new Rectangle(100, 100, 300, 300);
bool dragging = false;
bool rotating = false;
Point ptOld = new Point(0, 0);
float angle = 0;

protected override void OnPaint(PaintEventArgs e)
{
    Graphics dcPaint = e.Graphics;
    dcPaint.RotateTransform(angle);
    dcPaint.DrawRectangle(Pens.Black, areaRect);
    dcPaint.RotateTransform(-angle);
}

protected override void OnMouseDown(MouseEventArgs e)
{
    ptOld = new Point(e.X, e.Y);
    if (e.Button == MouseButtons.Left)
    {
        dragging = true;
    }
    if (e.Button == MouseButtons.Right)
    {
        rotating = true;
    }
}

protected override void OnMouseMove(MouseEventArgs e)
{
    if (dragging == true)
    {
        Point ptNew = new Point(e.X, e.Y);
        int dx = ptNew.X - ptOld.X;
        int dy = ptNew.Y - ptOld.Y;
        areaRect.Offset(dx, dy); // This one moves the rectangle 
        ptOld = ptNew;
        this.Invalidate();
    }
    if (rotating == true)
    {
        Point ptNew = new Point(e.X, e.Y);
        int dx = ptNew.X - ptOld.X;
        angle = angle + dx / 10f;
        ptOld = ptNew;
        this.Invalidate();
    }
}

protected override void OnMouseUp(MouseEventArgs e)
{
    dragging = false;
    rotating = false;
}

现在,矩形围绕其左上角旋转。如果在旋转之前应用平移,则可以使其围绕其中间旋转。

于 2012-04-15T21:21:52.260 回答
0

当用鼠标旋转矩形时,您定义旋转中心(centerXY),在您的情况下,它可能是矩形的中心。

在鼠标按下时记录鼠标坐标,mouse_downXY. 这两点定义了一条基线。移动鼠标时,您将定义另一条线,由当前鼠标坐标和矩形中心形成。

因此,您需要计算线 ( centerXY, mouse_downXY) 和 ( centerXY, current_mouseXY) 之间的角度。知道 3 点坐标计算 2 条线之间的角度是简单的三角函数,所以我不会为你编写代码 :) 但是这篇文章有答案。

于 2012-04-15T19:30:41.077 回答