2016-04-11 18 views
0

Ich habe UserControl der Größe 300 * 200. und Rechteck der Größe 300 * 200.Drehen und skalieren Rechteck nach Benutzerkontrolle

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

Wenn ich Rechteck in UserControl um 30 Grad drehen, bekomme ich Rechteck gedreht, aber es ist überdimensioniert.

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

Ich möchte Rechteck wie tatsächliches Ergebnis passen. Check Image here

Kann jemand eine Lösung darüber haben.

Danke.

+0

Es ist genau das, was Sie bitten, es zu. es dreht sich. Wenn Sie es mit einem Stück Papier machen, werden Sie sehen, dass es dasselbe ist. Was Sie wollen, ist drehen UND skalieren ich nehme an. – Noctis

+0

@Noctis - Haben Sie eine Lösung? –

+0

Wenn Sie WPF verwenden, können Sie auch einfach eine 'LayoutTransform' anstelle einer' RenderTransform' verwenden, und erreichen Sie das gleiche, minus der Mathematik ... – Noctis

Antwort

1

Es ist mehr eine mathematische Frage als die Programmierung eines.

Berechnen Sie die Bouncing-Box eines beliebigen Rechtecks, das um einen beliebigen Winkel im Bogenmaß gedreht ist.

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

berechnen Maßstab für x und y:

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

Wenden Sie es auf Ihrem Rechteck.

EDIT: zu Ihrem Beispiel Angewandte:

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

Vielen Dank für Ihren Vorschlag. Aber was, wenn die Größe des Rechtecks ​​sich ändert, wenn es 300 * 200 ist. –

+1

@SagarKhade dann müssen Sie es erneut berechnen. soweit ich weiß, 'a^2 + b^2 = c^2 'wird immer noch wahr sein :) – Noctis

+0

Aber ich meine zu sagen, dass wenn Usercontrol Größe ist 300 * 200 behoben. und Rechteck ist auch 300 * 200 und Winkel ändert sich auf 30. dann? –