0

サイズ 300*200 の UserControl があります。サイズ 300*200 の長方形。

graphics.DrawRectangle(Pens.Black, 0, 0, 300, 200);

userControl で四角形を 30 度回転すると、回転した四角形になりますが、サイズが大きくなります。

PointF center = new PointF(150,100);
graphics.FillRectangle(Brushes.Black, center.X, center.Y, 2, 2); // draw center point.

using (Matrix matrix = new Matrix())
{
      matrix.RotateAt(30, center);
      graphics.Transform = matrix;
      graphics.DrawRectangle(Pens.Black, 0, 0, 300, 200);
      graphics.ResetTransform();
}

実際の結果のように長方形に合わせたい。ここで画像をチェック

誰でもこれについて解決できますか。

ありがとう。

4

1 に答える 1

2

プログラミングというより数学の問題です。

ラジアン単位で任意の角度で回転させた任意の長方形のバウニング ボックスを計算します。

var newWidth= Math.Abs(height*Math.Sin(angle)) + Math.Abs(width*Math.Cos(angle))
var newHeight= Math.Abs(width*Math.Sin(angle)) + Math.Abs(height*Math.Cos(angle))

x と y のスケールを計算します。

scaleX = width/newWidth;
scaleY = height/newHeight;

長方形に適用します。

編集:あなたの例に適用:

    PointF center = new PointF(150, 100);
    graphics.FillRectangle(Brushes.Black, center.X, center.Y, 2, 2); // draw center point.
    var height = 200;
    var width = 300;
    var angle = 30;
    var radians = angle * Math.PI / 180;
    var boundingWidth = Math.Abs(height * Math.Sin(radians)) + Math.Abs(width * Math.Cos(radians));
    var boundingHeight = Math.Abs(width * Math.Sin(radians)) + Math.Abs(height * Math.Cos(radians));
    var scaleX = (float)(width / boundingWidth);
    var scaleY = (float)(height / boundingHeight);
    using (Matrix matrix = new Matrix())
    {
        matrix.Scale(scaleX, scaleY, MatrixOrder.Append);
        matrix.Translate(((float)boundingWidth - width) / 2, ((float)boundingHeight - height) / 2);
        matrix.RotateAt(angle, center);
        graphics.Transform = matrix;
        graphics.DrawRectangle(Pens.Black, 0, 0, width, height);
        graphics.ResetTransform();
    }
于 2016-04-11T06:43:01.693 に答える