我知道将一个点旋转一个角度的理论在互联网上一百万次,但我没有让我的代码正常工作。
我有一条有 2 个点的线,当您单击 2 个点中的一个时,您将相对于另一个点旋转该点。在我的测试用例中,我有一个左上点和一个右下点,所以是一条对角线。
我想确保线条捕捉到 90 度旋转,因此它始终是一条直线(垂直或水平)。所以我首先得到当前的角度,然后得到它应该是的角度,并计算差异。
Point startPoint = obj2.Location;
Point currentEndPoint = new Point(obj2.Location.X + obj2.Size.Width, obj2.Location.Y + obj2.Size.Height);
Point newEndPoint = e.Location;
double angle = MathHelper.GetAngleOfVerticalLine(startPoint, newEndPoint);
double angleToBe = MathHelper.GetClosestNumber(angle, new double[] { 0, 90, 180, 270, 360 });
double angleToDo = 0.0; // -5
if (angle < angleToBe)
{
angleToDo = Math.Abs(angle - angleToBe);
}
else
{
angleToDo = angleToBe - angle;
}
angleToDo %= 360;
Point newSize = MathHelper.RotatePoint(newEndPoint, startPoint, angleToDo);
obj.Size = (Size)newSize;
public static Point RotatePoint(Point pointToRotate, Point centerPoint, double angleInDegrees)
{
double angleInRadians = angleInDegrees * (Math.PI / 180);
double cosTheta = Math.Cos(angleInRadians);
double sinTheta = Math.Sin(angleInRadians);
return new Point
{
X =
(int)
(cosTheta * (pointToRotate.X - centerPoint.X) -
sinTheta * (pointToRotate.Y - centerPoint.Y) + centerPoint.X),
Y =
(int)
(sinTheta * (pointToRotate.X - centerPoint.X) +
cosTheta * (pointToRotate.Y - centerPoint.Y) + centerPoint.Y)
};
}
但是我得到的结果不是直线,而是随机的。角度、angleToBe 和 angleToDo 工作正常。RotatePoint 方法应该是问题所在,但我对此不是 100% 确定的。