Question

En fait ce que je suis en train de faire est d'avoir une image pivotent grâce à des événements de la souris. Par exemple, pendant que vous maintenez le bouton gauche de la souris, l'image tourne lorsque vous déplacez la souris vers le haut et vers le bas. J'ai trouvé une autre question ici presque comme le mien ( Comment puis-je faire pivoter une image en C # ), mais lors du mappage du paramètre d'angle dans le procédé de rotation (code source de la méthode dans le lien) pour l'angle calculé entre la souris et le centre de l'image j'obtenir une exception de dépassement de capacité jeté. L'image que je suis en train de tourner est dans une zone d'image. Des idées? Dois-je faire cela d'une autre manière?

Merci d'avance!

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

D'accord, je pense que mon TRIG était loin, je l'ai changé ...

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

Mais l'image ne tourne pas, il se déplace juste (je programmé la capacité de se déplacer aussi bien mais cela fonctionne très bien). Voici le morceau de code que je traite.

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


    }

Le drapeau rotateMode est défini sur true lorsque le picturebox est le double clic. Merci à tous!

--------- ----------- RÉPONSE

Merci à Gabe je trouve tous les petits petits défauts dans mon code et il fonctionne bien maintenant. La seule chose est que je devais faire la taille de l'image plus grande boîte pour adapter l'image pivotée. Voici le code correct pour tous ceux qui veulent connaître la réponse.

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

Merci Gabe et tout le monde!

Était-ce utile?

La solution

Avez-vous essayé quelque chose le long des lignes de this.pictureBox1.Image = RotateImage(this.pictureBox1.Image, angle);? La fonction RotateImage vous avez accédé à retourné une nouvelle image pivotée plutôt que de tourner en place que votre code attend.

Malheureusement, le faire pivoter une image déjà pivotée. Ce que vous devez faire est d'avoir l'image originale stockée quelque part, dire originalImage. Alors this.pictureBox1.Image = RotateImage(originalImage, angle);. De cette façon, il tourne toujours une nouvelle version de l'original.

Autres conseils

Sans voir votre code, nous ne pouvons que deviner. Je pense que vous faites une sorte de calcul trigonométrique, tels que:

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

Si votre x2-x1 va vers 0, votre argument Math.atan va vers l'infini, et trop-pleins.

  

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

Vous utilisez imageCenterY là deux fois, (bien que son ok dans le code affiché).

En tout cas je suggère d'utiliser ATan2 plutôt que Atan.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top