Поворот изображения с использованием положения мыши в C#
-
23-09-2019 - |
Вопрос
По сути, я пытаюсь повернуть изображение с помощью событий мыши.Например, пока вы удерживаете левую кнопку мыши, картинка вращается при перемещении мыши вверх и вниз.Я нашел здесь еще один вопрос, почти такой же, как мой (Как повернуть изображение в C#), но при сопоставлении параметра угла в методе поворота (исходный код метода в ссылке) с рассчитанным углом между мышью и центром изображения я получаю исключение переполнения.Изображение, которое я пытаюсь повернуть, находится в графическом поле.Есть идеи?Должен ли я делать это по-другому?
Заранее спасибо!
---------РЕДАКТИРОВАТЬ 1-----------
Хорошо, я думаю, что мой триггер был выключен, я изменил его на...
Угол = Атан((mousePosY - imageCenterY)/(mousePosX - imageCenterX)
Но теперь изображение не вращается, а просто перемещается (я запрограммировал и возможность его перемещения, но это работает нормально).Вот фрагмент кода, с которым я имею дело.
private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
isDragging = true;
pbCurrentX = e.X;
pbCurrentY = e.Y;
}
private void pictureBox_MouseMove(object sender, MouseEventArgs e)
{
// For moving the image
if (isDragging)
{
this.pictureBox1.Top = this.pictureBox1.Top + (e.Y - pbCurrentY);
this.pictureBox1.Left = this.pictureBox1.Left + (e.X - pbCurrentX);
}
// For rotating the image
if (rotateMode && isDragging)
{
y2 = e.Y;
y1 = (this.pictureBox1.Location.Y + (this.pictureBox1.Height / 2));
x2 = e.X;
x1 = (this.pictureBox1.Location.X + (this.pictureBox1.Width / 2));
angle = (float)Math.Atan((y2-y1)/(x2-x1));
// RotateImage method from the other question linked above
this.pictureBox1.Image = RotateImage(this.pictureBox1.Image, angle);
}
}
Флаг RotateMode устанавливается в значение true при двойном щелчке по PictureBox.Спасибо всем!
---------ОТВЕЧАТЬ-----------
Благодаря Гейбу я нашел все небольшие недостатки в своем коде, и теперь он работает нормально.Единственное, мне пришлось увеличить размер поля изображения, чтобы оно соответствовало повернутому изображению.Вот правильный код для всех, кто хочет знать ответ.
private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
isDragging = true;
pbCurrentX = e.X;
pbCurrentY = e.Y;
}
private void pictureBox_MouseMove(object sender, MouseEventArgs e)
{
if (isDragging && !rotateMode)
{
this.pictureBox1.Top = this.pictureBox1.Top + (e.Y - pbCurrentY);
this.pictureBox1.Left = this.pictureBox1.Left + (e.X - pbCurrentX);
}
if (rotateMode && isDragging)
{
y2 = e.Y;
y1 = (this.pictureBox1.Location.Y + (this.pictureBox1.Height / 2));
x2 = e.X;
x1 = (this.pictureBox1.Location.X + (this.pictureBox1.Width / 2));
angle = (float)Math.Atan2((y1 - y2), (x1 - x2));
pictureBox1.Image = RotateImage(currentImage, (100*angle));
}
}
private void pictureBox_MouseUp(object sender, MouseEventArgs e)
{
isDragging = false;
}
Спасибо Гейбу и всем остальным!
Решение
Вы пробовали что-то вроде this.pictureBox1.Image = RotateImage(this.pictureBox1.Image, angle);
?А RotateImage
функция, на которую вы ссылались, вернула новое повернутое изображение, а не вращала его на месте, как ожидает ваш код.
К сожалению, при этом вращается уже повернутое изображение.Что вам нужно сделать, это сохранить где-нибудь исходное изображение, скажем originalImage
.Тогда имейте this.pictureBox1.Image = RotateImage(originalImage, angle);
.Таким образом, он всегда вращает свежую версию оригинала.
Другие советы
Не видя вашего кода, мы можем только догадываться.Я предполагаю, что вы выполняете какой-то триггерный расчет, например:
theta = Math.Atan((y2 - y1) / (x2 - x1));
Если ваш x2-x1 стремится к 0, ваш аргумент Math.Atan стремится к бесконечности и переполняется.
Угол = Атан((mousePosY - imageCenterY)/(mousePosX - imageCenterY)
Ты используешь imageCenterY
дважды там (хотя в опубликованном вами коде это нормально).
В любом случае я бы предложил использовать Атан2 а не Атан.