Поворот изображения с помощью положения мыши в 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 идет к бесконечности и переполняется.

Угол = Атан ((mousePosY - imageCenterY)/(mousePosX - imageCenterY)

Ты используешь imageCenterY дважды (хотя в коде, который вы разместили, все нормально).

В любом случае я бы предложил использовать Atan2, а не 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 == исходное изображение

этот код работал у меня

Другие вопросы по тегам