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軸上の2点間の角度を計算したいと思います。その場合は、次のコードを試してください。

const double Rad2Deg = 180.0 / Math.PI;

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

2点間の角度の計算に関するこの記事もチェックしてください

于 2012-04-15T19:30:31.623 に答える
0

マウスで長方形を回転させるときは、回転の中心(centerXY)を定義します。この場合、長方形の中心になる可能性があります。

マウスダウンでマウス座標を記録しますmouse_downXY。これらの2つのポイントは、ベースラインを定義します。マウスを動かすときは、現在のマウス座標と長方形の中心によって形成される別の線を定義します。

centerXYしたがって、線( 、mouse_downXY)と(centerXY、 )の間の角度を計算する必要がありますcurrent_mouseXY。3点の座標を知っている2本の線の間の角度を計算することは単純な三角法なので、私はあなたのためにコードを書きません:)しかし、この投稿には答えがあります。

于 2012-04-15T19:30:41.077 に答える
0

古いxマウス座標と新しいxマウス座標(この例ではdx)の差を使用して角度を計算できます。Graphicsオブジェクトのメソッドを使用してRotateTransform、長方形を回転させることができます。

翻訳に加えて回転を行うようにコードを変更しました。長方形はマウスの左ボタンで移動でき、マウスの右ボタンで回転できます。

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 に答える