Faire pivoter une image à l'aide de la souris dans la position C #
-
23-09-2019 - |
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!
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.