Поворот изображения с использованием положения мыши в C#

StackOverflow https://stackoverflow.com/questions/2349509

Вопрос

По сути, я пытаюсь повернуть изображение с помощью событий мыши.Например, пока вы удерживаете левую кнопку мыши, картинка вращается при перемещении мыши вверх и вниз.Я нашел здесь еще один вопрос, почти такой же, как мой (Как повернуть изображение в 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 а не Атан.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top