-1

我知道将一个点旋转一个角度的理论在互联网上一百万次,但我没有让我的代码正常工作。

我有一条有 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% 确定的。

4

1 回答 1

0

您不能使用 Matrix.Rotate 类来完成繁重的工作吗?资料来源:http: //msdn.microsoft.com/en-us/library/s0s56wcf.aspx(当然数学是乐趣的一半)。

于 2013-09-19T14:38:43.060 回答