По принцип това, което се опитвам да направя, е да завъртя картина с помощта на събития на мишката. Например, докато държите натиснат левия бутон на мишката, картината се завърта, когато движите мишката нагоре и надолу. Намерих друг въпрос тук, почти като моя (Как да завъртя снимка в C#), но при съпоставяне на параметъра на ъгъла в метода за завъртане (изходния код на метода във връзката) към изчисления ъгъл между мишката и центъра на изображението получавам изключение за препълване. Изображението, което се опитвам да завъртя, е в поле за картина. Някакви идеи? Трябва ли да правя това по друг начин?
Благодаря предварително!
---------РЕДАКТИРАНЕ 1-----------
Добре, мисля, че моят тригон беше изключен, промених го на...
Ъгъл = 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, когато върху pictureBox се щракне два пъти. Благодаря на всички!
---------ОТГОВОР-----------
Благодарение на Гейб открих всички малки пречупвания в моя код и сега работи добре. Единственото нещо е, че трябваше да направя размера на полето с картината по-голям, за да пасне на завъртяното изображение. Ето правилния код за всички, които искат да знаят отговора.
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;
}
Благодаря на Гейб и на всички останали!