2016-04-11 16 views
0

UserControl of Size 300 * 200. ve 300 * 200 boyutlarında bir dikdörtgen. Ben 30 dereceye kadar UserControl dikdörtgen döndürdüğünüzdeKullanıcı denetimine göre döndürme ve ölçeklendirme

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

, ben döndürülmüş dikdörtgen olsun ama outsized edilir.

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

Gerçek sonuç gibi dikdörtgen sığdırmak istiyorum. Check Image here

Bu konuda herhangi bir çözümü olabilir mi?

Teşekkürler.

+0

Bu tam size bunu sormak şeyi yapıyor. döner. Bunu bir parça kağıda yaparsanız, bunun aynı olduğunu görürsünüz. İstediğin şey döndüğünü ve kabul ettiğim ölçek. – Noctis

+0

@Noctis - Bunun için herhangi bir çözüm var mı? –

+0

WPF kullanıyorsanız, bir 'RenderTransform' yerine bir' LayoutTransform 'kullanabilirsiniz ve aynı şeyi elde edersiniz, eksi matematik ... – Noctis

cevap

1

Bu, bir programlamadan daha çok bir matematik sorusu.

Radyanlarda herhangi bir açıyla döndürülen herhangi bir dikdörtgenin sıçrama kutusunu hesaplayın. x ve 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)) 

hesaplayın ölçeği:

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

sizin dikdörtgen uygulayın.

DÜZENLEME: En örneğe Uygulanan :

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

Öneriniz için teşekkürler. Ancak, dikdörtgen boyutunun değişmesi, 300 * 200 olması demektir. –

+1

@SagarKhade, daha sonra tekrar hesaplamanız gerekir. Bildiğim kadarıyla, bir^2 + b^2 = c^2 'hala doğru olacaktır :) – Noctis

+0

Ama eğer usercontrol boyutu 300 * 200 ise sabit olduğunu söylemek istiyorum. ve dikdörtgen de 300 * 200 ve açı 30'a değişiyor. –

İlgili konular