Поворот изображения с помощью положения мыши в C#
По сути, я пытаюсь повернуть картинку с помощью событий мыши. Например, удерживая левую кнопку мыши, изображение поворачивается при перемещении мыши вверх и вниз. Здесь я нашел еще один вопрос, почти такой же, как мой ( Как мне повернуть изображение в 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;
}
Спасибо Гейб и всем остальным!
3 ответа
Вы пробовали что-то вроде 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 идет к бесконечности и переполняется.
int y2 = _cursory; // Cursor.Postion.Y
int y1 = (this.pictureBox1.Location.Y + (this.pictureBox1.Height / 2));
int x2 = _cursorx; // Cursor.Postion.X
int x1 = (this.pictureBox1.Location.X + (this.pictureBox1.Width / 2));
float angle = (float)Math.Atan2((y1 - y2), (x1 - x2));
float xDistance = x1 - this.pictureBox1.Location.X;
float yDistance = y1 - this.pictureBox1.Location.Y;
double deg = angle / Math.PI * 180 + 180;
pictureBox1.Image = RotateImage(img, (int)deg);
// img == исходное изображение
этот код работал у меня