我有一个usercontrol,它在矩形的左右边缘包含一个矩形和2个椭圆。 在转换和旋转rendertransform发生后,我很想找出用户控件的坐标。
用户控件包含在画布中。
编辑: 在网上搜索了一段时间后,我能够在http://forums.silverlight.net/forums/p/136759/305241.aspx找到我的问题的答案,所以我想我会发布其他人有这个问题的链接。
我已将Tomas Petricek的帖子标记为答案,因为它是最接近解决方案的帖子。
答案 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方法 - 为其指定要转换的坐标,并将其旋转。