2016-04-11 2 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, вы также можете просто использовать «LayoutTransform» вместо «RenderTransform» и достичь того же, минуя математику ... – Noctis

ответ

1

Это скорее математический вопрос, чем программирование.

Рассчитать перегородку любого прямоугольника, повернутого под любым углом в радианах.

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

Но я хочу сказать, что если размер пользовательского контроля 300 * 200 исправлен. и прямоугольник также 300 * 200, а угол изменяется до 30. то? –

 Смежные вопросы

  • Нет связанных вопросов^_^