C#でのマウス位置を使用して画像を回転させます
-
23-09-2019 - |
質問
は基本的に私がやろうとしていると、マウスイベントを使用して画像の回転を持っています。たとえば、マウスの左ボタンを押しながら、画像の回転、マウスを上下に移動するとき。私は絵を回転させるにはどうすればよい(ほとんど私のように、ここに別の質問を見つけましたでC#の)が、マウスと画像の中心との間の算出された角度まで回転方法の角度パラメータ(リンクにおけるメソッドのソースコード)をマッピングするとき、私はスローオーバーフロー例外を取得します。私は回転しようとしている画像は、ピクチャボックス内にあります。何か案は?私はこの別の方法をやっているべきでしょうか?
事前に感謝します!
--------- EDIT 1 -----------
[OK]を、私は私のTRIGがオフだったと思う、私は...
にそれを変更しましたアングル=をAtan((mousePosY - imageCenterY)/(mousePosX - imageCenterX)
しかし、今の画像は、それだけで動く回転(それは同様に移動するために私ができることを、プログラムが、それがうまく動作します)しません。ここで私が扱っているコードの一部です。
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);
}
}
ピクチャボックスをダブルクリックしたときに、はrotateModeフラグがtrueに設定されています。おかげですべての!
--------- ANSWER -----------
ゲイブ私のおかげで私のコードに少しよじれのすべてを発見し、それは今、正常に動作します。唯一のことは、私は回転した画像に合わせて、ピクチャボックスのサイズを大きくしなければならなかったです。ここではその答えを知りたいすべての人のための正しいコードです。
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;
}
おかげでゲイブと皆!
解決
あなたはthis.pictureBox1.Image = RotateImage(this.pictureBox1.Image, angle);
の線に沿って何かをしようとしたことがありますか?あなたではなく、あなたのコードを期待として、インプレース、それを回転させるよりも、返された新しい回転した画像にリンクされているRotateImage
機能ます。
残念ながら、その回転をやって、既に回転画像。あなたがどこか保存された元の画像を持って何をする必要があるか、originalImage
を言います。そして、this.pictureBox1.Image = RotateImage(originalImage, angle);
を持っています。その方法は、それが常に元の新鮮なバージョンを回転させます。
他のヒント
あなたのコードを見ることなく、我々は唯一の推測することができます。
:私の推測では、あなたのような、trigの計算のいくつかの種類をやっているということですtheta = Math.Atan((y2 - y1) / (x2 - x1));
あなたのX2-X1が0の方になると、、Math.Atanへのあなたの引数が無限大に向けて進んで、オーバーフローします。
アングル=をAtan((mousePosY - imageCenterY)/(mousePosX - imageCenterY)
あなたは(あなたが投稿したコードでのOKが)、二回そこimageCenterY
を使用しています。
とにかく、私はむしろ、 ATAN2するを使用することをお勧めしAtanよります。