Pregunta

Básicamente lo que estoy tratando de hacer es tener una rotación de imagen utilizando los eventos del ratón. Por ejemplo, mientras se mantiene pulsado el botón izquierdo del ratón, gira la imagen cuando se mueve el ratón hacia arriba y hacia abajo. He encontrado otra pregunta aquí casi como la mía ( ¿Cómo girar una imagen en C # ), pero cuando la cartografía del parámetro de ángulo en el método rotate (código fuente método en el enlace) con el ángulo calculado entre el ratón y el centro de la imagen consigo un excepción de desbordamiento de lanzado. La imagen que estoy tratando de rotación está en un cuadro de imagen. ¿Algunas ideas? Debería hacer esto de otra manera?

Gracias de antemano!

--------- EDIT 1 -----------

Ok creo que mi trig estaba fuera, me lo cambió a ...

Ángulo = Atan ((mousePosY - imageCenterY) / (mousePosX - imageCenterX)

Pero ahora la imagen no gira, sólo se mueve (I programado la capacidad para que se mueva tan bien pero que funciona muy bien). Aquí está la pieza de código que estoy tratando.

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


    }

La bandera rotateMode se establece en true cuando el cuadro de imagen se hace clic doble. Gracias a todos!

--------- ----------- RESPUESTA

Gracias a Gabe me encontré con todas las pequeñas torceduras en mi código y funciona bien ahora. Lo único es que tenía que hacer que el tamaño de la imagen caja más grande para adaptarse a la imagen girada. Aquí está el código correcto para todos los que quieren saber la respuesta.

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

Gracias Gabe y todos los demás!

¿Fue útil?

Solución

¿Usted ha intentado algo en la línea de this.pictureBox1.Image = RotateImage(this.pictureBox1.Image, angle);? La función RotateImage se enlazó a regresar una nueva imagen girada en lugar de girar en el lugar como sus Espera de código.

Por desgracia, haciendo que gira una imagen ya rotada. Lo que hay que hacer es tener la imagen original almacenado en algún lugar, por ejemplo originalImage. Luego tener this.pictureBox1.Image = RotateImage(originalImage, angle);. De esa manera se gira siempre una nueva versión del original.

Otros consejos

Sin ver su código, sólo podemos adivinar. Mi conjetura es que usted está haciendo algún tipo de cálculo trig, como por ejemplo:

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

Si su x2-x1 va hacia 0, el argumento para Math.atan va hacia el infinito, y se desborda.

  

Ángulo = Atan ((mousePosY - imageCenterY) / (mousePosX - imageCenterY)

Está utilizando imageCenterY dos veces allí, (aunque no está mal en el código que envió).

En cualquier caso se recomienda usar Atan2 vez que Atan.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top