2013-04-26 1 views

ответ

3

сдвиговой факторы относительно начала системы координат.

Чтобы сохранить результат сдвига в «том же» месте, вам нужно добавить матрицу перевода.

  1. Создайте перевод, который перемещает точку, которая должна быть статичной в начало координат. В примере статическая точка (200300), поэтому перевод (-200, -300)
  2. применяются переводу
  3. Shear
  4. создать инверсию перевода. В примере: (200, 300)
  5. применить обратный перевод

КСТАТИ: Убедитесь, что вы Dispose матрицы и другие объекты GDI + !!

Matrix matrix = new Matrix(); 
matrix.Translate(200, 300); 
matrix.Shear(2, 0);    
matrix.Translate(-200, -300); 
g.Transform = matrix ; 
g.DrawRectangle(Pens.Black, new Rectangle(200, 200, 100, 100)); 
g.ResetTransform(); 

Или

using (var g = this.CreateGraphics()) 
{ 
    using(Matrix translation = new Matrix(), 
       reverseTranslation = translation.Clone(), 
       sheer = new Matrix() 
       combination = new Matrix()) 
    { 
     translation.Translate(200, 300); 
     reverseTranslation.Invert(); 
     sheer.Shear(2, 0); 
     combination.Multiply(translation); 
     combination.Multiply(sheer); 
     combination.Multiply(reverseTranslation); 

     g.Transform = combination; 
     g.DrawRectangle(Pens.Black, new Rectangle(200, 200, 100, 100)); 
     g.ResetTransform(); 
     g.DrawRectangle(Pens.Black, new Rectangle(200, 200, 100, 100)); 
    } 
} 
+0

и как я могу подсчитать значения для его перевода? Я не могу заставить его работать – Patryk

+1

Я добавил шаги к моему ответу –

+0

и как «создать обратный перевод»? использовать функцию инвертировать? он не принимает никаких аргументов – Patryk

2

Это то, что вам нужно сделать:

  1. Перевести нижний левый угол прямоугольника в начале координат. Позвольте смещению (-dX, -dY).
  2. Примените преобразование сдвига.
  3. Применить обратный перевод к вашему прямоугольнику, то есть (dX, dY).