2016-03-19 5 views
1

В моей программе на C# я использую метод RotateTransform, чтобы повернуть изображение, которое я хочу нарисовать. Это уже работает, но я не могу узнать, как я могу изменить центральную точку, где изображение вращается. По умолчанию это левый нижний угол моего Picturebox, к сожалению, мне нужно вращаться вокруг другой точки (760, 480) px.C# RotateTransform - проблема смены центра

Я искал всюду и наткнулся на это свойство CenterX.

В любом случае, похоже, что это свойство не найдено с Visual Studio, , поэтому я предполагаю, что я делаю это неправильно.

Мой текущий код выглядит следующим образом:

*e.Graphics.RotateTransform(angle); 
e.Graphics.DrawLine(Pens.Black, physicObj.lineStartingPoint, physicObj.lineEndingPoint); 
e.Graphics.FillEllipse(new SolidBrush(Color.Red), new Rectangle(physicObj.leftCornerCircle, physicObj.circleSize)); 
e.Graphics.FillRectangle(new SolidBrush(Color.Blue), new Rectangle(physicObj.leftCornerRectangle, physicObj.rectangleSize));* 

Эта часть работает отлично, но использует неправильную центральную точку, чтобы повернуть вокруг. Я пытался использовать

e.Graphics.RotateTransform.CenterX = ... ; 

Но там, кажется, нет никаких CenterX доступных в e.Graphics.RotateTransform. Visual Studio отображает красную строку под RotateTransform, говоря, что это метод, который недопустим в данном контексте. Я не знаю, как установить это свойство, и я не нашел примеров кодирования, которые делают это, и на основе информации, которую предоставляет Microsoft (по ссылке), я думал, что это способ сделать это.

Надеюсь, кто-то может объяснить, что мне нужно сделать, чтобы изменить эту центральную точку. Спасибо!

+1

Возможного дубликат [Черчение линии повернут под углом над растровым изображением] (http://stackoverflow.com/questions/36015098/draw-line-rotated-at-an -angle-over-bitmap) Еще один пример [здесь] (http://stackoverflow.com/questions/36035558/degree-rotation-on-triangle-without-changing-position-using-c-sharp-windows-appl/ 36039553 # 36039553) - В сортировке используйте Graphics.TranslateTranform beore и после ротации, затем нарисуйте .. - 'CenterX' - из Media, то есть WPF; Я предполагаю, что вы делаете WInForms – TaW

+0

Вам также необходимо изучить некоторые основы языка. Не имеет смысла рассматривать метод, подобный свойству. – usr

ответ

4

Это довольно просто:
1. перевести в центр
2. Вращая
3. перевести обратно

float centerX = 760; 
float centerY = 480; 
e.Graphics.TranslateTransform(-centerX, -centerY); 
e.Graphics.RotateTransform(angle); 
e.Graphics.TranslateTransform(centerX, centerY); 

По существу, вы создаете 3 матрицы и умножьте их для достижения результата - это матрица одиночного преобразования, основы 2D и 3D преобразований.


P.S. Вы можете создать метод расширения для удобства:

public static class GraphicsExtensions 
{ 
    public static void TranslateTransform(this Graphics g, float x, float y, float angle) 
    { 
    g.TranslateTransform(-x, -y); 
    g.RotateTransform(angle); 
    g.TranslateTransform(x, y); 
    } 
} 
Смежные вопросы