2016-04-11 23 views
0

私はUserControlのサイズが300 * 200です。 とサイズ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(); 
} 

私は実際の結果のように矩形に合わせたいと思います。 Check Image here

これについて誰でも解決できるでしょうか。

ありがとうございました。

+0

それは正確にあなたがそれを聞いて何をやっています。それは回転します。あなたが紙でそれをするなら、それは同じであることがわかります。あなたが望むのは、回転してスケールすることです。 – Noctis

+0

@Noctis - これに対する解決策はありますか? –

+0

WPFを使用している場合は、単に 'RenderTransform'の代わりに' LayoutTransform'を使用して、同じことを達成し、数学を除いてもよいでしょう... – Noctis

答えて

1

これはプログラミングよりも数学的な問題です。

角度をラジアン単位で回転させた長方形のブースボックスを計算します。 xとyの

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)) 

計算規模:

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

あなたの長方形にそれを適用します。

EDIT:あなたの例に適用 :

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(); 
    } 
+0

あなたの提案をありがとう。しかし、長方形のサイズの変更が300 * 200の場合はどうなるでしょうか? –

+1

@SagarKhadeもう一度計算する必要があります。私が知っている限り、 'a^2 + b^2 = c^2'はまだ真です:) – Noctis

+0

しかし、私は、usercontrolのサイズが300 * 200固定であると言うことを意味します。長方形も300 * 200で角度は30に変わります。 –

関連する問題