为什么RotateTransform.Transform()返回此Point?

时间:2016-07-26 14:52:54

标签: c# wpf

我试图为旋转的Rectangle创建一个边界框,我允许用户通过指定角度来旋转。为了实现这一点,我将Rectangle的RenderTransform分配给RotateTransform并编辑角度来完成此任务,并且它完美地运行:

public void Rotate(double _angle)
{
    rotateTransform.Angle = _angle;
}

当我尝试为这个旋转的Rectangle构造一个边界框时,会出现问题。在此之前,我尝试了我能在这里找到的所有内容,唯一能给我准确结果的函数是:

GeneralTransform transform = Rectangle.TransformToVisual(Container);
Rect boundingBox = transform.TransformBounds(new Rect(Rectangle.RenderSize));

但是,我始终无法访问容器以传递给TransformToVisual(),而且我在此处看到的任何其他排列都会返回不正确的值。所以我决定通过计算Rectangle的4个角点(我可以访问Rectangle的左边,顶部,宽度和高度)来构建我自己的内部边界框,然后使用之前的RotateTransform转换这4个点:

Point upperLeft = new Point(Rectangle.Left, Rectangle.Top);
Point upperRight = new Point(Rectangle.Left + Rectangle.Width, Rectangle.Top);
Point lowerLeft = new Point(Rectangle.Left, Rectangle.Top + Rectangle.Height);
Point lowerRight = new Point(Rectangle.Left + Rectangle.Width, Rectangle.Top + Rectangle.Height);

upperLeft = rotateTransform.Transform(upperLeft);
upperRight = rotateTransform.Transform(upperRight);
lowerLeft = rotateTransform.Transform(lowerLeft);
lowerRight = rotateTransform.Transform(lowerRight);

当Rectangle未旋转(rotateTransform.Angle == 0)时,此方法有效,但每当旋转时返回奇数值。我的问题是为什么?我仍然是WPF的新手,我似乎无法想象这一点。我也试过传递4个角的局部空间版本({0,0},{宽度,0},{0,高度},{宽度,高度}),即使矩形是,也会返回不正确的值没有轮换。

更新 我解决了我的问题,请看下面的答案。

1 个答案:

答案 0 :(得分:0)

所以我弄清楚我的问题是什么。应用于我的Rectangle的RotateTransform将其CenterX和CenterY属性设置为0,这是默认值。由于我使用Rectangle的RenderTransformOrigin来旋转Rectangle,所以我并不关心这一点。但是,使用RotateTransform转换Point时,这些值变得很重要,因为我假设在此计算中不考虑RenderTransformOrigin。因此,我通过在转换之前将CenterX和CenterY分配到我的Rectangle的左侧和顶部来解决问题,并在完成后将它们分配回0。也许它不是最优雅的解决方案,但它解决了我的问题:

rotateTransform.CenterX = Rectangle.Left;
rotateTransform.CenterY = Rectangle.Top;

upperLeft = rotateTransform.Transform(upperLeft);
upperRight = rotateTransform.Transform(upperRight);
lowerLeft = rotateTransform.Transform(lowerLeft);
lowerRight = rotateTransform.Transform(lowerRight);

rotateTransform.CenterX = 0;
rotateTransform.CenterY = 0;