逐点旋转

时间:2013-09-16 23:29:59

标签: c# rotation point angle points

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

我有一条2点的线,当你点击2点中的1点时,你将相对于另一点旋转点。在我的测试用例中,我有一个左上角和一个右下角,所以是一条对角线。

我想确保线条捕捉到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)
    };
}

但是我得到的结果不是直线,而是随机的。角度,角度ToBe和angleToDo正常工作。 RotatePoint方法应该是问题,但我不是百分之百确定。

1 个答案:

答案 0 :(得分:0)

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