旋转后获取坐标

时间:2011-03-03 12:27:12

标签: c# wpf

我有一个usercontrol,它在矩形的左右边缘包含一个矩形和2个椭圆。 在转换和旋转rendertransform发生后,我很想找出用户控件的坐标。

用户控件包含在画布中。

编辑: 在网上搜索了一段时间后,我能够在http://forums.silverlight.net/forums/p/136759/305241.aspx找到我的问题的答案,所以我想我会发布其他人有这个问题的链接。

我已将Tomas Petricek的帖子标记为答案,因为它是最接近解决方案的帖子。

4 个答案:

答案 0 :(得分:7)

如果您想自己实施计算,则可以使用以下方法计算旋转后点的位置(按指定的度数):

public Point RotatePoint(float angle, Point pt) { 
   var a = angle * System.Math.PI / 180.0;
   float cosa = Math.Cos(a), sina = Math.Sin(a);
   return new Point(pt.X * cosa - pt.Y * sina, pt.X * sina + pt.Y * cosa);
}

通常,您可以将变换表示为矩阵。要组合转换,您只需将矩阵相乘,这是一个非常可组合的解决方案。表示旋转的矩阵包含上述方法中的 sin cos 值。请参阅维基百科上的Rotation matrix(和Transformation matrix)。

答案 1 :(得分:2)

围绕原点旋转2D点[4,6] 36度。点的新位置是什么?

解决方案:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            // Origin of the point
            Point myPoint = new Point(4, 6);
            // Degrees to rotate the point
            float degree = 36.0F;

            PointF newPoint = RotatePoint(degree, myPoint);

            System.Console.WriteLine(newPoint.ToString());
            System.Console.ReadLine();
        }

        public static PointF RotatePoint(float angle, Point pt)
        {
            var a = angle * System.Math.PI / 180.0;
            float cosa = (float)Math.Cos(a);
            float sina = (float)Math.Sin(a);
            PointF newPoint = new PointF((pt.X * cosa - pt.Y * sina), (pt.X * sina + pt.Y * cosa));
            return newPoint;
        }
    }
}

答案 2 :(得分:1)

想要围绕非零中心旋转的人的扩展方法:

public static class VectorExtentions
{
    public static Point Rotate(this Point pt, double angle, Point center)
    {
        Vector v = new Vector(pt.X - center.X, pt.Y - center.Y).Rotate(angle);
        return new Point(v.X + center.X, v.Y + center.Y);
    }

    public static Vector Rotate(this Vector v, double degrees)
    {
        return v.RotateRadians(degrees * Math.PI / 180);
    }

    public static Vector RotateRadians(this Vector v, double radians)
    {
        double ca = Math.Cos(radians);
        double sa = Math.Sin(radians);
        return new Vector(ca * v.X - sa * v.Y, sa * v.X + ca * v.Y);
    }
}

答案 3 :(得分:0)

使用RotateTransform对象的Transform方法 - 为其指定要转换的坐标,并将其旋转。