Множественные преобразования GDI для 2D-графики в C#

#c# #gdi

#c# #gdi

Вопрос:

Я пишу графическое приложение, которое может выполнять глобальные преобразования (поворачивать и переводить) с помощью управления мышью. Есть ли у кого-нибудь пример, показывающий, как реализовать это с помощью следующих методов:

 MouseDown(object sender, MouseEventArgs e) - set the translate/rotate offset
MouseMove(object sender, MouseEventArgs e) - increment translate/rotate variables
OnPaint(Graphics graphics, float time)     - use Matrix object to do global transform
  

Проблема: после поворота графики, когда я затем перевожу их, они перемещаются в соответствии с преобразованием поворота. Нужно ли мне компенсировать это вращение в MouseDown и MouseMove, где я устанавливаю переменную translate?

Комментарии:

1. Очень неясно. Умножение матриц не является коммутативным. Имеет большое значение, переводите ли вы сначала, затем поворачиваете, или сначала поворачиваете, а затем переводите.

2. Правильно, Ханс. Итак, мой вопрос: «как мне этого добиться?». Представьте, что вы создаете компьютерную игру, в которой пользователь может блуждать по 2D-лабиринту. Когда вы нажимаете клавишу для поворота, персонаж пользователя остается неподвижным, пока лабиринт поворачивается. Когда вы нажимаете клавишу для перемещения вперед, снова символ остается неподвижным (скажем, в центре экрана), но 2d-карта перемещается вниз. Я уже делал это, применяя тригонометрию ко всем объектам мира по отдельности. Но использование графической матрицы кажется гораздо лучшим подходом.

3. Вы сделали вращения правильным образом? То есть переведите объект в исходное положение, затем поверните, а затем переведите его в исходное положение. Потому что есть такая вещь, как ОСЬ ВРАЩЕНИЯ, которая имеет ОГРОМНОЕ значение

Ответ №1:

Помните, наведение курсора мыши выполняется только один раз. Я думаю, что в событии MouseDown, помимо установки смещения, вам нужно его преобразовать. А также, возможно, вам нужна переменная

 bool isMouseDown = true;
  

чтобы помочь MouseMove, укажите, что он находится в состоянии «после наведения курсора мыши».

И в событии MouseMove, по сути, вы выполняете тот же процесс, что и в событии MouseDown, разница — это только координата мыши.