Frage

Im Grunde, was ich versuche, ein Bild zu drehen zu tun ist, haben Mausereignisse verwendet. Zum Beispiel, während Sie die linke Maustaste gedrückt halten, die Bild dreht sich, wenn Sie die Maus bewegen nach oben und unten. Ich fand eine andere Frage hier fast wie meine ( Wie drehe ich ein Bild in C # ), aber wenn in dem rotate Verfahren (Verfahren Quellcode in Verbindung) mit dem berechneten Winkel zwischen der Maus und dem Mittelpunkt des Bildes des Winkel Parameterzuordnung I eine Überlaufausnahme geworfen zu bekommen. Das Bild, das ich zu drehen bin versucht in einem Bildfeld. Irgendwelche Ideen? Soll ich diese andere Art und Weise tun?

Vielen Dank im Voraus!

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

Ok ich glaube, mein trig war weg, habe ich es zu ...

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

Aber jetzt wird das Bild nicht drehen, ist es gerade bewegt (programmierter ich die Möglichkeit, es so gut zu bewegen, aber das funktioniert gut). Hier ist das Stück Code, mit mir zu tun habe.

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


    }

Die rotateMode Flag auf true gesetzt ist, wenn der PictureBox doppelt angeklickt. Dank alle!

--------- ANTWORT -----------

Durch Gabe fand ich all die kleinen Knicke in meinem Code und es funktioniert jetzt. Nur, was ist ich die Größe des Bildes zu machen hatte größere Feld das gedrehte Bild zu passen. Hier ist der richtige Code für jeden, der die Antwort wissen will.

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

Danke Gabe und alle anderen!

War es hilfreich?

Lösung

Haben Sie etwas entlang der Linien von this.pictureBox1.Image = RotateImage(this.pictureBox1.Image, angle); versucht? Die RotateImage Funktion, die Sie zurück ein neues gedrehtes Bild verknüpft, anstatt sie an Ort und Stelle, wie der Code erwartet drehen.

Leider tun, das dreht ein bereits gedrehte Bild. Was Sie brauchen, ist das Originalbild irgendwo, sagen originalImage gespeichert zu tun haben. Dann haben this.pictureBox1.Image = RotateImage(originalImage, angle);. Auf diese Weise dreht er sich immer eine frische Version des Originals.

Andere Tipps

Ohne Code zu sehen, können wir nur vermuten. Meine Vermutung ist, dass Sie irgendeine Art von trig Berechnung tun, wie zum Beispiel:

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

Wenn Ihr x2-x1 gegen 0 geht, Ihr Argument Math.atan gegen unendlich geht, und überläuft.

  

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

Sie verwenden imageCenterY zweimal dort (obwohl es ist ok in dem Code, den Sie geschrieben).

Auf jeden Fall würde ich mit vorschlagen Atan2 eher als Atan.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top