Pergunta

Basicamente, o que estou tentando fazer é ter uma imagem girando usando eventos do mouse. Por exemplo, enquanto você pressiona o botão esquerdo do mouse, a imagem gira quando você move o mouse para cima e para baixo. Eu encontrei outra pergunta aqui quase como a minha (Como faço para girar uma imagem em C#) Mas, ao mapear o parâmetro ângulo no método rotativo (código -fonte do método no link) para o ângulo calculado entre o mouse e o centro da imagem, recebo uma exceção de transbordamento. A imagem que estou tentando girar está em uma caixa de imagem. Alguma ideia? Devo estar fazendo isso de outra maneira?

Desde já, obrigado!

--------- Editar 1 -----------

Ok, acho que meu trigo estava desligado, eu mudei para ...

Ângulo = atan ((mouseposy - imagecentery)/(mouseposx - imagecenterx)

Mas agora a imagem não gira, ela apenas se move (eu programei a capacidade de se mover também, mas isso funciona bem). Aqui está o pedaço de código com o qual estou lidando.

    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);
        }


    }

O sinalizador Rotatemode é definido como true quando a caixa de imagem é clicada duas vezes. Obrigado a todos!

---------RESPONDA-----------

Graças a Gabe, encontrei todas as pequenas torções do meu código e funciona bem agora. A única coisa é que eu tive que aumentar o tamanho da caixa de imagens para ajustar a imagem girada. Aqui está o código correto para todos que querem saber a resposta.

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;
    }

Obrigado Gabe e todos os outros!

Foi útil?

Solução

Você já tentou algo parecido this.pictureBox1.Image = RotateImage(this.pictureBox1.Image, angle);? o RotateImage função que você vinculou para retornar uma nova imagem rotacionada, em vez de girá-la no local, conforme o seu código espera.

Infelizmente, fazer isso gira uma imagem já rotativa. O que você precisa fazer é ter a imagem original armazenada em algum lugar, digamos originalImage. Então tem this.pictureBox1.Image = RotateImage(originalImage, angle);. Dessa forma, ele sempre gira uma versão nova do original.

Outras dicas

Sem ver seu código, só podemos adivinhar. Meu palpite é que você está fazendo algum tipo de cálculo de tatão, como:

theta = Math.Atan((y2 - y1) / (x2 - x1));

Se o seu X2-X1 for para 0, seu argumento para Math.atan vai para o Infinity e transborda.

Ângulo = atan ((mouseposy - imagecentery)/(mouseposx - imagecentery)

Você está usando imageCenterY duas vezes lá, (embora esteja bem no código que você postou).

De qualquer forma, eu sugeriria usar Atan2 em vez de atan.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top