旋转矩形时计算角度
本文关键字:计算 旋转 | 更新日期: 2023-09-27 18:31:16
我有一个C#(Windows Forms)程序,它在图片框上有一个矩形。它们也可以以一定角度(旋转)绘制。我想使用鼠标移动来旋转该矩形。
我有移动该矩形的代码
Rectangle areaRect = new Rectangle(100,100, 300, 300);
Bool dragging = false;
Point ptOld = new Point(0, 0);
protected override void OnPaint(PaintEventArgs e)
{
Graphics dcPaint = e.Graphics;
dcPaint.DrawRectangle(rectPen, areaRect);
}
protected override void OnMouseDown(MouseEventArgs e)
{
ptOld = new Point(e.X, e.Y);
dragging = true;
}
protected override void OnMouseMove(MouseEventArgs e)
{
if(dragging = true)
{
Point ptNew = new Point(e.X, e.Y);
int dx = ptNew.X - ptOld.X;
int dy = ptNew.Y - ptOld.Y;
areaRect.Offset(dx, dy); // This one moves the rectangle
ptOld = ptNew;
this.Invalidate();
}
}
protected override void OnMouseUp(MouseEventArgs e)
{
dragging = false;
}
现在我的要求是旋转这个矩形,任何想法,如何实现。
我想你想计算 X 轴上两点之间的角度。如果是这样,请尝试以下代码:
const double Rad2Deg = 180.0 / Math.PI;
return Math.Atan2(ptOld.Y - e.Y, e.X - ptOld.X) * Rad2Deg;
另请查看这篇关于计算两点之间角度的文章
当用鼠标旋转矩形时,您可以定义旋转中心(centerXY
),在这种情况下,它可能是矩形的中心。
鼠标按下记录鼠标坐标时,mouse_downXY
.这两点定义了一条基线。移动鼠标时,您将定义另一条线,由当前鼠标坐标和矩形中心组成。
所以你需要计算直线(centerXY
,mouse_downXY
)和(centerXY
,current_mouseXY
)之间的角度。用知道 3 点坐标计算 2 行之间的角度是简单的三角函数,所以我不会为你写代码:)然而,这篇文章有答案。
您可以使用旧 x 和新 x 鼠标坐标(示例中为 dx)之间的差异来计算角度。可以使用 Graphics 对象的 RotateTransform
方法来旋转矩形。
除了翻译之外,我还修改了您的代码以进行旋转。您可以使用鼠标左键移动矩形,也可以使用鼠标右键旋转矩形。
Rectangle areaRect = new Rectangle(100, 100, 300, 300);
bool dragging = false;
bool rotating = false;
Point ptOld = new Point(0, 0);
float angle = 0;
protected override void OnPaint(PaintEventArgs e)
{
Graphics dcPaint = e.Graphics;
dcPaint.RotateTransform(angle);
dcPaint.DrawRectangle(Pens.Black, areaRect);
dcPaint.RotateTransform(-angle);
}
protected override void OnMouseDown(MouseEventArgs e)
{
ptOld = new Point(e.X, e.Y);
if (e.Button == MouseButtons.Left)
{
dragging = true;
}
if (e.Button == MouseButtons.Right)
{
rotating = true;
}
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (dragging == true)
{
Point ptNew = new Point(e.X, e.Y);
int dx = ptNew.X - ptOld.X;
int dy = ptNew.Y - ptOld.Y;
areaRect.Offset(dx, dy); // This one moves the rectangle
ptOld = ptNew;
this.Invalidate();
}
if (rotating == true)
{
Point ptNew = new Point(e.X, e.Y);
int dx = ptNew.X - ptOld.X;
angle = angle + dx / 10f;
ptOld = ptNew;
this.Invalidate();
}
}
protected override void OnMouseUp(MouseEventArgs e)
{
dragging = false;
rotating = false;
}
现在,矩形围绕其左上角旋转。如果在旋转之前应用平移,则可以使其围绕中间旋转。