Domanda

Fondamentalmente quello che sto cercando di fare è di avere un quadro ruotare utilizzando gli eventi del mouse. Ad esempio, mentre si tiene premuto il tasto sinistro del mouse, l'immagine ruota quando si sposta il mouse su e giù. Ho trovato un'altra domanda qui quasi come il mio ( Come posso ruotare un'immagine in C # ), ma quando la mappatura del parametro angolare nel metodo rotate (metodo di codice sorgente in link) per l'angolo calcolato tra il mouse e il centro dell'immagine ottengo un'eccezione di overflow gettato. L'immagine che sto cercando di rotazione si trova in una casella di immagine. Qualche idea? Dovrei fare in un altro modo?

Grazie in anticipo!

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

Ok penso che il mio trig era spento, l'ho cambiato in ...

= Angolo Atan ((mousePosY - imageCenterY) / (mousePosX - imageCenterX)

Ma ora l'immagine non ruota, si muove solo (ho programmato la possibilità per di muoversi come bene, ma che funziona bene). Ecco il pezzo di codice ho a che fare.

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


    }

Il flag rotateMode è impostata su true quando il pictureBox è doppio clic. Grazie a tutti!

--------- ----------- RISPOSTA

Grazie a Gabe ho trovato tutti i piccoli nodi nel mio codice e funziona bene ora. L'unica cosa è che ho avuto per ridurre le dimensioni dell'immagine scatola più grande per adattare l'immagine ruotata. Ecco il codice corretto per tutti coloro che vogliono conoscere la risposta.

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

Grazie Gabe e tutti gli altri!

È stato utile?

Soluzione

Hai provato qualcosa sulla falsariga di this.pictureBox1.Image = RotateImage(this.pictureBox1.Image, angle);? La funzione RotateImage si è collegato al restituito una nuova immagine ruotata invece di ruotare sul posto, come il codice si aspetta.

Purtroppo, facendo che ruota un'immagine già ruotata. Quello che dovete fare è avere l'immagine originale memorizzati da qualche parte, dire originalImage. Poi hanno this.pictureBox1.Image = RotateImage(originalImage, angle);. In questo modo esso ruota sempre una versione aggiornata dell'originale.

Altri suggerimenti

Senza vedere il codice, possiamo solo immaginare. La mia ipotesi è che si sta facendo un certo tipo di calcolo trig, come ad esempio:

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

Se il tuo x2-x1 va verso 0, il tuo argomento di Math.atan va verso l'infinito, e overflow.

  

= Angolo Atan ((mousePosY - imageCenterY) / (mousePosX - imageCenterY)

Si utilizza imageCenterY due volte lì, (anche se il suo ok nel codice che avete inviato).

Comunque io suggerirei di usare ATAN2 piuttosto di Atan.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top